2017-10-22 125 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語句明確設置外鍵約束的名稱。 (主鍵也應該命名,但它不在這個例子中)

作爲最佳實踐,你應該總是給你的約束有意義的名字。