代码之家  ›  专栏  ›  技术社区  ›  Moak

如何更改外键引用操作(行为)

  •  81
  • Moak  · 技术社区  · 15 年前

    ON DELETE CASCADE (删除父级时删除子级)

    SQL命令将此更改为什么 ON DELETE RESTRICT ? (无法删除父级(如果它有子级)

    6 回复  |  直到 11 年前
        1
  •  176
  •   Grijesh Chauhan Anand Krishnan    13 年前

    老问题,但添加答案,以便可以得到帮助

    分两步进行:

    假设,一个 table1 有一个 外键 具有列名 fk_table2_id 约束 名称 fk_name table2 t2 ( ).

       table1 [ fk_table2_id ] --> table2 [t2]
    

    ,删除旧约束:( reference

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

    注意约束被删除,列不被删除

    ,添加新约束:

    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
    :
    
        2
  •  22
  •   Romuald Brunet    12 年前

    您可以在一个查询中完成此操作 如果 你愿意改变它的名字:

    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
  •  12
  •   pascal    9 年前
    ALTER TABLE DROP FOREIGN KEY fk_name;
    ALTER TABLE ADD FOREIGN KEY fk_name(fk_cols)
                REFERENCES tbl_name(pk_names) ON DELETE RESTRICT;
    
        4
  •  6
  •   Vasily    9 年前

    请记住,MySQL在删除外键后在列上保留一个简单的索引。因此,如果您需要更改“references”列,您应该分3个步骤来完成

    • 删除原始FK
    • 删除索引(名称为previous fk,使用 drop index 条款)
    • 创建新FK
        5
  •  4
  •   DavidSM    7 年前

    我有一堆FK要修改,所以我写了一些东西来为我做陈述。我想我会分享:

    SELECT
    
    CONCAT('ALTER TABLE `' ,rc.TABLE_NAME,
        '` DROP FOREIGN KEY `' ,rc.CONSTRAINT_NAME,'`;')
    , CONCAT('ALTER TABLE `' ,rc.TABLE_NAME,
        '` ADD CONSTRAINT `' ,rc.CONSTRAINT_NAME ,'` FOREIGN KEY (`',kcu.COLUMN_NAME,
        '`) REFERENCES `',kcu.REFERENCED_TABLE_NAME,'` (`',kcu.REFERENCED_COLUMN_NAME,'`) ON DELETE CASCADE;')
    
    FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
    LEFT OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
        ON kcu.TABLE_SCHEMA = rc.CONSTRAINT_SCHEMA
        AND kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME
    WHERE DELETE_RULE = 'NO ACTION'
    AND rc.CONSTRAINT_SCHEMA = 'foo'
    
        6
  •  3
  •   stamster    8 年前

    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