2010-07-18 116 views
6

定義外鍵還定義了一個索引嗎?我有mysql v5.1.46 &我正在看MySQL Administrator工具,它顯示外鍵作爲索引,所以我想確認一下嗎?MySQL外鍵問題

回答

3

是的,當你定義一個外鍵約束時,MySQL 5.1自動在引用表上創建一個索引。 MySQL需要在引用表和被引用表的外鍵上使用索引。

但請注意,索引是在引用表上自動創建的只有,而不是在引用的表上創建的。 MySQL不會允許你創建一個外鍵引用表中引用字段不能使用索引:

CREATE TABLE orders (
    id int PRIMARY KEY, 
    code int, 
    name varchar(10) 
) ENGINE=INNODB; 

CREATE TABLE order_details (
    detail_id int PRIMARY KEY, 
    order_code int, 
    value int, 
    FOREIGN KEY (order_code) REFERENCES orders(code) 
) ENGINE=INNODB; 

ERROR 1005 (HY000): Can't create table 'test.order_details' 

這不是很常見的,因爲你會經常要創建引用外鍵約束被引用表的主鍵和主鍵自動編入索引。但是,它可能值得記住。

創建於orderscode領域的指數可以解決這個問題:

CREATE INDEX ix_orders_code ON orders(code); 
8
  • 如果已經有一個可用的索引(其中外鍵列被列爲第一列的索引以相同的順序),則不會創建新的索引。
  • 如果沒有可用的索引,那麼創建一個外鍵也會創建一個索引。

這包括在documentation

InnoDB需要對外鍵和引用鍵進行索引,以便外鍵檢查可以快速且不需要表掃描。在引用表中,必須有一個索引,其中外鍵列以相同順序排列爲第一列。如果索引表不存在,則會在引用表上自動創建這樣的索引。 (這與一些較早的版本形成對比,在這些版本中索引必須明確創建,否則外鍵約束的創建將失敗。)如前所述,使用index_name(如果已給定)。

+0

更正了過時的文檔鏈接。 – 2015-03-16 16:31:02