【问题标题】:Delete all foreign keys in database(MySql)删除数据库中的所有外键(MySql)
【发布时间】:2013-01-10 20:57:21
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您不知道要删除什么,您将如何重新创建所有 FK?
  • 所有foreign key constraints 是什么意思?您还必须考虑这些列是否也有索引.. 在这里查看 stackoverflow.com/questions/1438654/… :它用于 sql server,您可能会发现类似的语法用于更改
  • 只是所有的外键,我可以重新创建 FKey,因为我使用 doctrine-project.org 并拥有将重新创建表的模型

标签: mysql foreign-keys


【解决方案1】:

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

“模式名称”是指您的数据库名称。都是一样的。

【讨论】:

    【解决方案2】:

    您可以尝试使用 As Like of Follow ..

    ALTER TABLE tableName
    DROP FOREIGN KEY fieldName;
    ADD FOREIGN KEY (newForignKeyFieldName);
    

    您也可以尝试使用 Reference Key.As like .....

    ALTER TABLE tableName
    DROP FOREIGN KEY fieldName;
    ADD FOREIGN KEY (newForignKeyFieldName)
    REFERENCES anotherTableName(reference_id);
    

    【讨论】:

      【解决方案3】:

      以下查询将自动构建正确的语法。 确保将您的真实数据库模式名称放在 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() 获取当前活动数据库名称

      【讨论】:

        【解决方案4】:

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

        数据库删除

        如果您使用的是 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 脚本。

        【讨论】:

          【解决方案5】:

          执行以下查询

          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 表不可写
          • 这种方法(即使用户有权限,但它没有)只会在这么多表中留下大量垃圾值。这个解决方案不能胜任
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-04-13
          • 2020-06-23
          • 1970-01-01
          • 2018-01-15
          • 1970-01-01
          • 2014-02-09
          • 1970-01-01
          相关资源
          最近更新 更多