22

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

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

我也尝试过SET FOREIGN_KEY_CHECKS=0;,但我仍然无法重命名该列。

4

5 回答 5

38

您可以使用此 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;
...

“模式名称”是指您的数据库名称。这是同一件事。

于 2015-09-24T13:01:46.233 回答
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);
于 2013-01-27T11:06:20.747 回答
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()获取当前活动的数据库名称

于 2015-04-12T14:39:34.560 回答
0

找到这个帖子后我仍然遇到一些问题,但我似乎找到了适合我的工作流程。

数据库删除

如果您使用的是 MySQL Workbench,则需要通过执行以下 3 个步骤来关闭 SAFE UPDATE:

  1. MySql Workbench > Preferences > SQL EDITOR >(设置底部)
  2. 关闭安全更新
  3. 然后注销您的连接并重新连接

开始清除数据库并开始新的步骤

  1. 删除表中的所有数据

(这个 MySQL 脚本将为数据库中的每个表创建一个 DELETE FROM 脚本。)

SELECT concat('DELETE FROM ',table_schema,'.',table_name,';') FROM information_schema.table_constraints WHERE table_schema='!!TABLE_SCHEMA!!';

复制它的输出并运行它。您可能需要逐行进行此操作。

  1. 从表中删除所有外键

(这个 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 脚本。

于 2018-11-05T20:42:22.070 回答
-4

执行以下查询

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

于 2013-01-27T11:07:06.430 回答