我想重命名表中的列,该表是许多表的外键。显然,只有删除约束才能实现这一点,正如我在link中找到的那样。
我不想手动删除所有constratints有没有办法删除数据库中的所有外键约束?
我也试过SET FOREIGN_KEY_CHECKS=0;
,但我仍然无法重命名该列。
答案 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个步骤来关闭“安全更新”:
(此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脚本。
答案 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