39

外键导致我在修改数据库结构以满足新要求时遇到太多问题 - 我想修改主键,但是当外键引用有问题的表时我似乎不能(我认为是因为 MySQL 删除了表并重新创建)。

因此,当我在数据库上工作时,我想简单地删除所有外键并稍后重新创建它们。有没有一种巧妙的方法可以做到这一点?

4

4 回答 4

71

SELECT concat('ALTER TABLE ', TABLE_NAME, ' DROP FOREIGN KEY ', CONSTRAINT_NAME, ';') 
FROM information_schema.key_column_usage 
WHERE CONSTRAINT_SCHEMA = 'db_name' 
AND referenced_table_name IS NOT NULL;

并运行输出。

于 2014-12-15T09:52:45.567 回答
50

您可以在要进行的任何 Alter Table 语句之前简单地发出以下命令:

SET foreign_key_checks = 0;

这将关闭数据库连接的外键约束检查。然后,您可以进行更改而无需担心约束。

完成后,不要忘记发出:

SET foreign_key_checks = 1;

重新打开它们。

请注意,这仍然不允许您创建一个新的外键约束,该约束会因为列数据类型不匹配而失败。

于 2012-12-05T22:08:32.797 回答
10

另一个版本的 Zoozy 代码,这里你只能选择一个表:

SELECT concat('ALTER TABLE ', TABLE_NAME, ' DROP FOREIGN KEY ', CONSTRAINT_NAME, ';') 
FROM information_schema.key_column_usage 
WHERE CONSTRAINT_SCHEMA = 'YOUR DB HERE' 
AND TABLE_NAME='YOUR TABLE HERE' 
AND REFERENCED_TABLE_NAME IS NOT NULL;

还有一个程序:

DROP PROCEDURE IF EXISTS dropForeignKeysFromTable;

delimiter ///
create procedure dropForeignKeysFromTable(IN param_table_schema varchar(255), IN param_table_name varchar(255))
begin
    declare done int default FALSE;
    declare dropCommand varchar(255);
    declare dropCur cursor for 
        select concat('alter table ',table_schema,'.',table_name,' DROP FOREIGN KEY ',constraint_name, ';') 
        from information_schema.table_constraints
        where constraint_type='FOREIGN KEY' 
            and table_name = param_table_name
            and table_schema = param_table_schema;

    declare continue handler for not found set done = true;

    open dropCur;

    read_loop: loop
        fetch dropCur into dropCommand;
        if done then
            leave read_loop;
        end if;

        set @sdropCommand = dropCommand;

        prepare dropClientUpdateKeyStmt from @sdropCommand;

        execute dropClientUpdateKeyStmt;

        deallocate prepare dropClientUpdateKeyStmt;
    end loop;

    close dropCur;
end///
于 2015-06-24T15:11:55.423 回答
2

如果你想跨多个数据库做同一张表,不要忘记CONSTRAINT_SCHEMA输入输出:

SELECT concat('ALTER TABLE ', CONSTRAINT_SCHEMA,'.',TABLE_NAME, ' DROP FOREIGN KEY ', CONSTRAINT_NAME, ';')
FROM information_schema.key_column_usage
WHERE CONSTRAINT_SCHEMA like 'your_db_prefix_%'
    AND TABLE_NAME='your_table'
    AND REFERENCED_TABLE_NAME IS NOT NULL;
于 2018-04-03T19:44:29.107 回答