从所有表中删除外键关系

时间:2011-08-13 00:15:00

标签: mysql foreign-keys

我有一个包含多个表的数据库。许多表都具有外键约束的字段。我想截断表,然后用新数据重新填充它们,我也想取消外键,因为一些关系已经改变。基本上,我想再次从头开始构建FK约束。如何从所有表中删除当前的FK约束?

3 个答案:

答案 0 :(得分:10)

您可以使用information_schema。 看一下这个页面

http://dev.mysql.com/doc/refman/5.0/en/key-column-usage-table.html

select concat('alter table ',table_name,' drop foreign key ',constraint_name,';') 
from information_schema.key_column_usage
where constraint_schema = 'your_db' and referenced_table_name = 'table_name';

然后运行生成的输出。

您可以执行类似操作以截断所有表格。

select concat('truncate ',table_name,';') 
from information_schema.tables
where table_schema = 'your_db' and table_type = 'base table'

这将截断指定数据库中的所有表。所以要小心使用它。

答案 1 :(得分:3)

我猜你已经找到了一个解决方案,因为这篇帖子已经有六个月了,但我最近不得不想出一个脚本来将外键约束放到MySQL的特定表中,这样可以帮助其他人同一条船:

# create a handy dandy stored procedure
DELIMITER $$
CREATE PROCEDURE DropConstraints(refschema VARCHAR(64), reftable VARCHAR(64), refcolumn VARCHAR(64))
BEGIN
    WHILE EXISTS(
        SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
        WHERE 1
        AND REFERENCED_TABLE_SCHEMA = refschema
        AND REFERENCED_TABLE_NAME = reftable
        AND REFERENCED_COLUMN_NAME = refcolumn
    ) DO
        BEGIN
            SET @sqlstmt = (
                SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DROP FOREIGN KEY ',CONSTRAINT_NAME)
                FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
                WHERE 1
                AND REFERENCED_TABLE_SCHEMA = refschema
                AND REFERENCED_TABLE_NAME = reftable
                AND REFERENCED_COLUMN_NAME = refcolumn
                LIMIT 1
            );
            PREPARE stmt1 FROM @sqlstmt;
            EXECUTE stmt1;
        END;
    END WHILE;
END$$
DELIMITER ;

要运行它,只需使用:

SET @schema = 'schema_name';
CALL DropConstraints(@schema, 'TableName', 'Referenced_Column_1');
CALL DropConstraints(@schema, 'TableName', 'Referenced_Column_2');

如果您不想保留程序:

DROP PROCEDURE DropConstraints;

当然,如果要将所有FK约束都删除到表中,可以删除refcolumn参数和每个where子句的最后一行。

答案 2 :(得分:0)

 ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;