删除数据库中的所有外键(MySql)

Delete all foreign keys in database(MySql)

我想重命名一个表中的列,该表是许多表的外键。 显然,这只有在你删除约束时才有可能,正如我在这个链接中发现的那样。

我不想手动删除所有constratints有没有办法删除数据库中的所有外键约束?

我也试过SET FOREIGN_KEY_CHECKS=0;,但我仍然无法重命名该列。


您可以使用此SQL生成ALTER TABLES(!!YOUR_SCHEMA_HERE!!需要替换为您的架构):

1
2
3
4
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_schema='!!YOUR_SCHEMA_HERE!!';

它会像这样生成SQL:

1
2
3
4
alter table viewpoint_test.answer_code DROP FOREIGN KEY fk_answer_code_codebook_item1;
alter table viewpoint_test.answer_code DROP FOREIGN KEY fk_answer_code_questionary_answer1;
alter table viewpoint_test.codebook DROP FOREIGN KEY codebook_ibfk_1;
...

以下查询将自动构建正确的语法。
确保将实际的数据库模式名称放在WHERE条件中。
只需执行返回的每一行,所有FOREIGN KEYS都将消失。

我将反向(加回来)作为练习给你。

1
2
3
SELECT CONCAT("alter table", TABLE_NAME," drop foreign key", CONSTRAINT_NAME,";") AS runMe
FROM information_schema.key_column_usage
WHERE TABLE_SCHEMA='MY_SCHEMA_NAME' AND CONSTRAINT_NAME <> 'PRIMARY';

如果您需要它独立于架构,您可以编写:
TABLE_SCHEMA=DATABASE()获取当前活动的数据库名称


您可以尝试使用以下内容..

1
2
3
ALTER TABLE tableName
DROP FOREIGN KEY fieldName;
ADD FOREIGN KEY (newForignKeyFieldName);

你也可以尝试参考Key.As像.....

1
2
3
4
ALTER TABLE tableName
DROP FOREIGN KEY fieldName;
ADD FOREIGN KEY (newForignKeyFieldName)
REFERENCES anotherTableName(reference_id);

找到这个帖子后我还有一些问题,但我似乎找到了适合我的工作流程。

数据库删除

如果您使用的是MySQL Workbench,则需要通过执行以下3个步骤来关闭SAFE UPDATE:

  • MySql Workbench> Preferences> SQL EDITOR>(设置底部)
  • 关闭SAFE UPDATE
  • 然后注销你的连接并重新连接
  • 开始清除数据库并启动新的步骤

  • 删除表中的所有数据
  • (此MySQL脚本将为数据库中的每个表创建一个DELETE FROM脚本。)


    SELECT concat('DELETE FROM ',table_schema,'.',table_name,';')
    FROM information_schema.table_constraints
    WHERE table_schema='!!TABLE_SCHEMA!!';

    复制此输出并运行它。您可能需要逐行进行此操作。

  • 从表中删除所有外键
  • (此MySql脚本将为数据库中的每个表创建一个ALTER TABLE _ DROP FOREIGN KEY脚本。)


    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_schema='!!TABLE_SCHEMA!!';

    复制此输出并运行它。您可能需要逐行进行此操作。

    完成此操作后,您应该能够运行DROP DATABASE脚本。


    执行以下查询

    1
    select * from information_schema.key_column_usage

    将显示数据库中存在的所有约束(包括列名,约束类型,表和模式)。您会注意到这些列:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CONSTRAINT_CATALOG
    CONSTRAINT_SCHEMA
    CONSTRAINT_NAME
    TABLE_CATALOG
    TABLE_SCHEMA
    TABLE_NAME
    COLUMN_NAME
    ORDINAL_POSITION
    POSITION_IN_UNIQUE_CONSTRAINT
    REFERENCED_TABLE_SCHEMA
    REFERENCED_TABLE_NAME
    REFERENCED_COLUMN_NAME

    然后,如果您计划删除引用列的每个约束,则应考虑REFERENCED_ *列并执行以下操作:

    1
    2
    3
    4
    5
    6
    7
    DELETE FROM information_schema.key_column_usage
    WHERE
        REFERENCED_TABLE_SCHEMA='myschema'
        AND
        REFERENCED_TABLE_NAME='mytable'
        AND
        REFERENCED_COLUMN_NAME='mycolumn'

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