2

我玩弄mysql和我發現兩種方法來定義外鍵:MySQL外鍵定義?

CREATE TABLE posts(
    id INT NOT NULL AUTO_INCREMENT, 
    user_id INT NOT NULL, 
    post_title VARCHAR(255) NOT NULL, 
    PRIMARY KEY(id), 
    FOREIGN KEY name (user_id) REFERENCES users(id) 
); 

和:

CREATE TABLE posts(
    id INT NOT NULL AUTO_INCREMENT, 
    user_id INT NOT NULL, 
    post_title VARCHAR(255) NOT NULL, 
    PRIMARY KEY(id), 
    CONSTRAINT name 
     FOREIGN KEY(user_id) 
     REFERENCES users(id) 
); 

什麼是這兩者之間的區別?它們是相同的,它只是一個偏好問題,你喜歡怎麼寫?或者有一些差異?

+0

不投票關閉,但這篇文章可能重複與你:http://stackoverflow.com/questions/310561/mysql-terminology-constraints-vs-foreign-keys-difference –

回答

2

由於FOREIGN KEY Constraints下記載:

CREATE TABLEALTER TABLE語句中的InnoDB的外鍵約束定義的語法如下:

[CONSTRAINT [symbol]] FOREIGN KEY 
    [index_name] (index_col_name, ...) 
    REFERENCES tbl_name (index_col_name,...) 
    [ON DELETE reference_option] 
    [ON UPDATE reference_option] 

reference_option: 
    RESTRICT | CASCADE | SET NULL | NO ACTION 

index_name代表的外鍵ID。如果給定,如果明確定義了外鍵的索引,則忽略它。否則,如果InnoDB爲外鍵創建索引,則它使用index_name作爲索引名稱。

外鍵的定義是受以下條件:

[ deletia ]

  • 如果CONSTRAINT symbol條款已定,那麼symbol值必須在數據庫中是唯一的。如果沒有給出該子句,則InnoDB將自動創建該名稱。

[ deletia ]

如果FOREIGN KEY條款包括一個CONSTRAINT的名字,當你創建的外鍵,你可以參考這個名字下降外鍵。否則,在創建外鍵時,內部生成的值爲InnoDB

因此,第一個示例創建一個名爲name(如果尚不存在)的索引的自動命名外鍵約束;而第二個示例使用自動生成的索引名稱(如果尚不存在)創建名爲name的外鍵約束。

除此之外,它們是相同的。

+0

這是一個更容易比理解手冊。 – Twifty

+1

@Waldermort:幾乎完全從手冊引用...:/ – eggyal