关于外键约束困惑
问题描述:
我有一个关于约束的一般性问题。 下面的例子有什么区别?关于外键约束困惑
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)
);
谢谢!
答
没有逻辑差异。
标准SQL同时支持两种形式的声明约束:在列级别(如第一个示例中)以及第二个示例中的表级别。
如果您的主键或外键涉及多个列,则需要使用表级约束语法。
MySQL支持PRIMARY KEY的列级和表级语法。但是如果你后来运行SHOW CREATE TABLE Orders
,你会看到MySQL报告它好像它被声明为表级约束。
MySQL仅支持FOREIGN KEY的表级语法。
这是支持列级FOREIGN KEY语法的长期功能请求,但到目前为止还没有实现。 https://bugs.mysql.com/bug.php?id=4919
答
在第一个示例中,数据库将隐式命名约束。
在第二个示例中,create table语句明确设置外键约束的名称。 (主键也应该命名,但它不在这个例子中)
作为最佳实践,你应该总是给你的约束有意义的名字。
这看起来像t-sql给我(意味着SQL Server,而不是MySql)看比尔的答案。 –