2010-07-29 57 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