2010-07-29 56 views

回答

122

老問題,但增加的答案,使人們可以得到幫助

它的兩個步驟:

假設,一個table1具有外鍵,列名爲fk_table2_id,其中約束名稱fk_nametable2與密鑰t2,在我的示意圖中下面的內容類似)中提及。

table1 [ fk_table2_id ] --> table2 [t2] 

第一步,刪除舊約束:(reference

ALTER TABLE `table1` 
DROP FOREIGN KEY `fk_name`; 

通知約束被刪除,列不會被刪除

第二步,添加新的CONSTRAINT:

ALTER TABLE `table1` 
ADD CONSTRAINT `fk_name` 
    FOREIGN KEY (`fk_table2_id`) REFERENCES `table2` (`t2`) ON DELETE CASCADE; 

加入約束,柱已經存在

實施例:

我有一個UserDetails表指Users表:

mysql> SHOW CREATE TABLE UserDetails; 
: 
: 
`User_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`Detail_id`), 
    KEY `FK_User_id` (`User_id`), 
    CONSTRAINT `FK_User_id` FOREIGN KEY (`User_id`) REFERENCES `Users` (`User_id`) 
: 
: 

第一步:

mysql> ALTER TABLE `UserDetails` DROP FOREIGN KEY `FK_User_id`; 
Query OK, 1 row affected (0.07 sec) 

第二步:

mysql> ALTER TABLE `UserDetails` ADD CONSTRAINT `FK_User_id` 
    -> FOREIGN KEY (`User_id`) REFERENCES `Users` (`User_id`) ON DELETE CASCADE; 
Query OK, 1 row affected (0.02 sec) 

結果:

mysql> SHOW CREATE TABLE UserDetails; 
: 
: 
`User_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`Detail_id`), 
    KEY `FK_User_id` (`User_id`), 
    CONSTRAINT `FK_User_id` FOREIGN KEY (`User_id`) REFERENCES 
             `Users` (`User_id`) ON DELETE CASCADE 
: 
+1

謝謝你,老問題,但你是對的,另一個答案是有點神祕,我回來的一天。 – Moak 2013-01-20 03:57:53

+0

也謝謝你:) – 2013-01-20 11:27:25

+1

不應該按照原始問題的要求添加限制ON DELETE RESTRICT? – Noumenon 2015-08-02 11:36:55

10
ALTER TABLE DROP FOREIGN KEY fk_name; 
ALTER TABLE ADD FOREIGN KEY fk_name(fk_cols) 
      REFERENCES tbl_name(pk_names) ON DELETE RESTRICT; 
+0

FK_NAME是列名? – Moak 2010-07-29 07:02:04

+2

幫我找到解決辦法'ALTER TABLE table_name ADD' ...'ON DELETE RESTRICT' – Moak 2010-07-29 07:13:07

+2

不,fk_name是約束名稱。 提供一個是可選的。 我不確定,但也許你可以使用'SHOW CREATE TABLE'來檢索它。 – pascal 2010-07-29 07:16:16

9

爲此,您可以在一個查詢如果你願意改變它的名字:

ALTER TABLE table_name 
    DROP FOREIGN KEY `fk_name`, 
    ADD CONSTRAINT `fk_name2` FOREIGN KEY (`remote_id`) 
    REFERENCES `other_table` (`id`) 
    ON DELETE CASCADE; 

如果您有一張大桌子,這可以最大限度地減少停機時間。

3

請記住,MySQL在刪除外鍵後在列上保留一個簡單的索引。所以,如果你需要改變「參考」一欄,你應該做它在3個步驟

  • 滴原FK
  • 刪除索引(名稱爲以前的FK,使用drop index子句)
  • 創建新的FK
3

您只需使用一個查詢來統治他們: ALTER TABLE products DROP FOREIGN KEY oldConstraintName, ADD FOREIGN KEY (product_id, category_id) REFERENCES externalTableName (foreign_key_name, another_one_makes_composite_key) ON DELETE CASCADE ON UPDATE CASCADE