我想重命名表中的列,该列是许多表的外键。显然,这只有在您删除约束时才有可能,正如我在此链接中发现的那样。
我不想手动删除所有约束有没有办法删除数据库中的所有外键约束?
我也尝试过SET FOREIGN_KEY_CHECKS=0;
,但我仍然无法重命名该列。
我想重命名表中的列,该列是许多表的外键。显然,这只有在您删除约束时才有可能,正如我在此链接中发现的那样。
我不想手动删除所有约束有没有办法删除数据库中的所有外键约束?
我也尝试过SET FOREIGN_KEY_CHECKS=0;
,但我仍然无法重命名该列。
您可以使用此 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;
...
“模式名称”是指您的数据库名称。这是同一件事。
您可以尝试使用 As Like of following ..
ALTER TABLE tableName
DROP FOREIGN KEY fieldName;
ADD FOREIGN KEY (newForignKeyFieldName);
您也可以尝试使用参考键。就像.....
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()
获取当前活动的数据库名称
找到这个帖子后我仍然遇到一些问题,但我似乎找到了适合我的工作流程。
如果您使用的是 MySQL Workbench,则需要通过执行以下 3 个步骤来关闭 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 脚本。
执行以下查询
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