2010-12-22 66 views
1

定義外鍵我看到兩種方法是做:哪種方式在MySQL

方法1:

CREATE TABLE IF NOT EXISTS `sample` ( 
    `sample_id` tinyint(2) NOT NULL AUTO_INCREMENT, 
    `description` varchar(32) NOT NULL, 
    `parent_id` int(10) NOT NULL, 
    `created` datetime NOT NULL, 
    PRIMARY KEY (`sample_id`) 
) ENGINE=InnoDB; 

ALTER TABLE sample ADD CONSTRAINT parent_id FOREIGN KEY (parent_id) REFERENCES parent_tbl(parent_id); 

方法2:

CREATE TABLE IF NOT EXISTS `sample` ( 
    `sample_id` tinyint(2) NOT NULL AUTO_INCREMENT, 
    `description` varchar(32) NOT NULL, 
    `parent_id` int(10) NOT NULL, 
    `created` datetime NOT NULL, 
    PRIMARY KEY (`sample_id`), 
    Foreign Key (parent_id) references parent_tbl(parent_id) 
) ENGINE=InnoDB; 

哪種方法更好的或者何時使用另一個?

回答

0

第一個給你更多的靈活性。

1)如果您按順序創建表,以便在引用表之後創建引用表,則需要使用第一種方法。如果你的引用中有循環,那麼可能沒有辦法避免這種情況。如果沒有循環,則存在所有引用表在其引用表之前創建的所有引用表的順序,但您可能不想花時間弄清楚該順序是什麼並重新安排腳本。

2)創建表格時,您並不總是確切知道需要哪些索引。在創建索引時,衡量某些實際數據的性能增益通常是一個好主意,也許可以嘗試使用多個不同索引來查看哪些索引效果更好。要使此策略起作用,您需要首先創建表,插入一些數據,然後您需要修改索引以進行測試。在這種情況下,刪除並重新創建表格不如ALTER TABLE實用。

除此之外,沒有什麼區別,如果你從無到有,沒有什麼特別的理由可以相互支持。結果索引是相同的。

+0

聽起來不錯,謝謝。 – Juds 2010-12-22 04:05:47

0

最終產品難以區分。

爲了清楚起見(很高興看到該約束明確地站在它自己的位置上),我可能會提倡第一個。

爲了簡潔(在1條語句和2條中說同樣的話),我可能會提倡第二條。

2

如果你需要一個外鍵添加到現有表,使用方法1,如果你是從頭開始創建的使用模式方法2

有沒有最好的方式,他們做同樣的事情。