我想在一个表的外键到许多表重命名列。 很显然,如果你删除的约束,因为我在这找到了,这是唯一可能的联系 。
我不想删除所有constratints手动是有办法删除数据库中的所有外键约束?
我也曾尝试SET FOREIGN_KEY_CHECKS=0;
但我仍然无法重命名列。
我想在一个表的外键到许多表重命名列。 很显然,如果你删除的约束,因为我在这找到了,这是唯一可能的联系 。
我不想删除所有constratints手动是有办法删除数据库中的所有外键约束?
我也曾尝试SET FOREIGN_KEY_CHECKS=0;
但我仍然无法重命名列。
执行以下查询
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
您可以使用此SQL生成变更表( !!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;
...
您可以尝试使用下面的像..
ALTER TABLE tableName
DROP FOREIGN KEY fieldName;
ADD FOREIGN KEY (newForignKeyFieldName);
你也可以尝试与参考Key.As喜欢.....
ALTER TABLE tableName
DROP FOREIGN KEY fieldName;
ADD FOREIGN KEY (newForignKeyFieldName)
REFERENCES anotherTableName(reference_id);
下面的查询将自动生成正确的语法。 确保你在把你真正的数据库架构名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()
来获得当前活动DB名称
我仍然有一些问题,发现这个线程后,但我似乎找到了最适合我的工作的工作流程。
如果你正在使用MySQL Workbench中,你将需要把安全更新关闭通过执行以下3个步骤:
(这MySQL的脚本将创建一个删除脚本数据库中的每个表。)
SELECT concat('DELETE FROM ',table_schema,'.',table_name,';') FROM information_schema.table_constraints WHERE table_schema='!!TABLE_SCHEMA!!';
复制此输出,并运行它。 您可能需要此行由行。
(这个MySQL脚本将创建呐ALTER为数据库中的每个表的表_ 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脚本。