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

时间:2013-01-27 10:29:07

标签: mysql foreign-keys

我想重命名表中的列,该表是许多表的外键。显然,只有删除约束才能实现这一点,正如我在link中找到的那样。

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

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

5 个答案:

答案 0 :(得分:31)

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

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:

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;
...

答案 1 :(得分:1)

您可以尝试使用As like of follow ..

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

您也可以尝试使用Reference Key。就像......

ALTER TABLE tableName
DROP FOREIGN KEY fieldName;
ADD FOREIGN KEY (newForignKeyFieldName)
REFERENCES anotherTableName(reference_id);

答案 2 :(得分:1)

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

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

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()获取当前活动的数据库名称

答案 3 :(得分:0)

找到此线程后,我仍然遇到一些问题,但是我似乎找到了适合我的工作流程。

数据库删除

如果您使用的是MySQL Workbench,则需要通过执行以下3个步骤来关闭“安全更新”:

  1. MySql Workbench>首选项> SQL编辑器>(设置的底部)
  2. 关闭“安全更新”
  3. 然后退出连接并重新连接

启动清除数据库和启动新数据库的步骤

  1. 从表中删除所有数据

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

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

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

  1. 从表中删除所有外键

(此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脚本。

答案 4 :(得分:-3)

执行以下查询

select * from information_schema.key_column_usage

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

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 _ * 列并执行以下操作:

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