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

Bor*_*lis 18 mysql foreign-keys

我想重命名一个表中的列,该表是许多表的外键.显然,这只有在你删除约束时才有可能,正如我在这个链接中发现的那样.

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

我也试过SET FOREIGN_KEY_CHECKS=0;但我还是不能重命名这个专栏.

lop*_*san 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!!';
Run Code Online (Sandbox Code Playgroud)

它会像这样生成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;
...
Run Code Online (Sandbox Code Playgroud)


Aug*_*sto -4

执行以下查询

select * from information_schema.key_column_usage
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

然后,如果您计划删除引用列的每个约束,您应该考虑REFERENCED_*列并运行如下所示的命令:

DELETE FROM information_schema.key_column_usage 
WHERE 
    REFERENCED_TABLE_SCHEMA='myschema'
    AND
    REFERENCED_TABLE_NAME='mytable'
    AND
    REFERENCED_COLUMN_NAME='mycolumn'
Run Code Online (Sandbox Code Playgroud)

http://dev.mysql.com/doc/refman/5.1/en/key-column-usage-table.html

  • 遗憾的是,这不起作用,因为“information_schema”表不可写 (7认同)