2017-10-22 127 views
1

我有一个关于约束的一般性问题。 下面的例子有什么区别?关于外键约束困惑

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

这看起来像t-sql给我(意味着SQL Server,而不是MySql)看比尔的答案。 –

回答

1

没有逻辑差异。

标准SQL同时支持两种形式的声明约束:在列级别(如第一个示例中)以及第二个示例中的表级别。

如果您的主键或外键涉及多个列,则需要使用表级约束语法。

MySQL支持PRIMARY KEY的列级和表级语法。但是如果你后来运行SHOW CREATE TABLE Orders,你会看到MySQL报告它好像它被声明为表级约束。

MySQL仅支持FOREIGN KEY的表级语法。

这是支持列级FOREIGN KEY语法的长期功能请求,但到目前为止还没有实现。 https://bugs.mysql.com/bug.php?id=4919

1

在第一个示例中,数据库将隐式命名约束。
在第二个示例中,create table语句明确设置外键约束的名称。 (主键也应该命名,但它不在这个例子中)

作为最佳实践,你应该总是给你的约束有意义的名字。