我有一个关于约束的一般问题。 以下示例有什么区别?
CREATE TABLE Orders (
OrderID int NOT NULL PRIMARY KEY,
OrderNumber int NOT NULL,
PersonID int FOREIGN KEY REFERENCES Persons(PersonID)
);
CREATE TABLE Orders (
OrderID int NOT NULL,
OrderNumber int NOT NULL,
PersonID int,
PRIMARY KEY (OrderID),
CONSTRAINT FK_PersonOrder FOREIGN KEY (PersonID)
REFERENCES Persons(PersonID)
);
谢谢!
答案 0 :(得分:1)
在第一个示例中,数据库将隐式命名约束 在第二个示例中,create table语句显式设置外键约束的名称。 (主键也应该命名,但不是在这个例子中)
作为最佳实践,您应始终为约束提供有意义的名称。
答案 1 :(得分:1)
没有逻辑差异。
标准SQL支持两种形式的声明约束:在列级别,如在第一个示例中,在表级别,在第二个示例中。
如果您有一个涉及多个列的主键或外键,则需要表级约束语法。
MySQL支持PRIMARY KEY的列级和表级语法。但是,如果您随后运行SHOW CREATE TABLE Orders
,您将看到MySQL将其报告回来,就像它被声明为表级约束一样。
MySQL仅支持FOREIGN KEY的表级语法。
支持列级FOREIGN KEY语法一直是一个长期的功能请求,但到目前为止还没有实现。 https://bugs.mysql.com/bug.php?id=4919