对外键约束感到困惑

时间:2017-10-22 03:24:57

标签: mysql sql constraints

我有一个关于约束的一般问题。 以下示例有什么区别?

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)
);

谢谢!

2 个答案:

答案 0 :(得分:1)

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

作为最佳实践,您应始终为约束提供有意义的名称。

答案 1 :(得分:1)

没有逻辑差异。

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

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

MySQL支持PRIMARY KEY的列级和表级语法。但是,如果您随后运行SHOW CREATE TABLE Orders,您将看到My​​SQL将其报告回来,就像它被声明为表级约束一样。

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

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