2017-10-22 10 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ではありません)Billの答えを参照してください。 –

答えて

1

論理的な違いはありません。

標準SQLは、両方の形式の宣言制約をサポートしています。最初の例のような列レベル、2番目の例のテーブルレベルです。

プライマリキーまたは複数の列を含む外部キーがある場合は、テーブルレベルの制約構文が必要です。

MySQLは、PRIMARY KEYの列レベルとテーブルレベルの両方の構文をサポートしています。しかし、その後SHOW CREATE TABLE Ordersを実行した場合、MySQLはテーブルレベルの制約として宣言されているかのようにレポートします。

MySQLは、FOREIGN KEYのテーブルレベルの構文のみをサポートしています。

カラムレベルのFOREIGN KEY構文をサポートすることは長年の機能要求でしたが、これまで実装されていませんでした。 https://bugs.mysql.com/bug.php?id=4919

1

最初の例では、データベースは暗黙的に制約の名前を付けます。
2番目の例では、create table文は、外部キー制約の名前を明示的に設定します。 (プライマリキーにも名前を付ける必要がありますが、この例ではありません)

ベストプラクティスとして、常に制約事項に意味のある名前を付ける必要があります。

関連する問題