【问题标题】:MySQL Workbench - setting ALL table foreign keys on delete action to NO ACTION in one goMySQL Workbench - 一次性将删除操作上的所有表外键设置为 NO ACTION
【发布时间】:2016-05-25 10:50:38
【问题描述】:

我有一个包含许多表的大型数据库,并且“删除时”操作设置为对所有表进行级联。是否可以一次性将此选项更改为“无操作”,而无需打开 Workbench 中的每个表和每个关系属性?

我认为这在 Workbench 界面中是不可能的,但我敢打赌它可以通过使用遍历所有表并更改关系的游标以编程方式完成

【问题讨论】:

  • INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS(查看列delete_rule)和INFORMATION_SCHEMA.KEY_COLUMN_USAGE(所有使用和引用的列)包含有关外键约束的数据。您可以使用这些数据编写一个脚本,为您生成代码。有人已经做了SQL Script to drop all foreign keys,创建部分的工作方式类似。您必须决定编写脚本是否会更快(这很简单,但需要一些时间)。
  • 这是一个很好的评论@Solarflare ...为什么不回答它
  • @Edgar Navasardyan。找到剧本了吗?注释指向 postgres 或 sqlserver 解决方案。你有什么适合Mysql的吗?

标签: mysql mysql-workbench


【解决方案1】:

必须删除约束并使用 ON DELETE CASCADE 添加它。

您可以将所有表的列表与 SQL 一起用于:

1-drop all

SELECT concat('ALTER TABLE ' , TABLE_NAME,' DROP FOREIGN KEY ' ,CONSTRAINT_NAME ,';' )
FROM  information_schema.REFERENTIAL_CONSTRAINTS  
WHERE  constraint_schema = '<database>';

2- 全部添加

SELECT concat('ALTER TABLE ' , TABLE_NAME,' ADD FOREIGN KEY (', column_name ,') REFERENCES ', REFERENCED_TABLE_NAME ,' (', REFERENCED_COLUMN_NAME,') ON DELETE CASCADE;' )
FROM  information_schema.key_column_usage where 
constraint_name <>'PRIMARY' 
AND TABLE_SCHEMA = '<database>';

你可以复制上面查询的结果sql并执行。

注意:在存储第二个查询(例如在文本文件中)给出的要再次创建的信息之前,不要执行第一个“全部删除”。

【讨论】:

    猜你喜欢
    • 2014-08-03
    • 1970-01-01
    • 2021-09-03
    • 2020-06-23
    • 1970-01-01
    • 2013-03-22
    • 2021-04-19
    • 1970-01-01
    • 2013-01-10
    相关资源
    最近更新 更多