我想重命名一张表中的一个外键列,而该列是许多表的外键。显然,只有在删除约束条件后才能实现这一点,正如我在这个链接中发现的那样。
我不想手动删除所有约束条件,有没有一种方法可以删除数据库中的所有外键约束条件?
我还尝试过SET FOREIGN_KEY_CHECKS=0;
但我仍然无法重命名该列。
我想重命名一张表中的一个外键列,而该列是许多表的外键。显然,只有在删除约束条件后才能实现这一点,正如我在这个链接中发现的那样。
我不想手动删除所有约束条件,有没有一种方法可以删除数据库中的所有外键约束条件?
我还尝试过SET FOREIGN_KEY_CHECKS=0;
但我仍然无法重命名该列。
您可以使用此SQL生成ALTER TABLES(需要将!!YOUR_SCHEMA_HERE!!
替换为您的架构):
您可以使用此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;
...
“Schema name”指的是你的数据库名称。其实它们是同一个东西。
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()
以获取当前活动的数据库名称。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);
在找到这个线程后,我仍然遇到了一些问题,但是我似乎找到了适合我的工作流程。
如果您正在使用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脚本。)
从information_schema.table_constraints WHERE constraint_type='FOREIGN KEY' AND table_schema='!!TABLE_SCHEMA!!';选择concat('alter table ',table_schema,'.',table_name,' DROP FOREIGN KEY ',constraint_name,';')
将输出内容复制并运行。你可能需要逐行执行此操作。
完成此操作后,您应该能够运行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
information_schema
表不可写。 - SystemParadox