【问题标题】:How to remove constraints from my MySQL table?如何从我的 MySQL 表中删除约束?
【发布时间】:2012-12-16 19:39:26
【问题描述】:

我想从我的表中删除约束。我的查询是:

ALTER TABLE `tbl_magazine_issue` 
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users`

但是我得到了一个错误:

#1064 - 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“约束FK_tbl_magazine_issue_mst_users”附近使用正确的语法

【问题讨论】:

  • 值得注意的是,如果您创建了CHECK 约束,则无需删除它,因为没有创建实际约束。您可以从information_schema.table_constraints 中选择进行验证,甚至可以一遍又一遍地运行add constraint 而不会出现任何错误。 MySQL 不支持 CHECK 约束,但允许 SQL 旨在创建它们(而不实际创建约束)。
  • 您的语法完全有效,现在支持demo

标签: mysql foreign-keys constraints alter


【解决方案1】:

Mysql 有一个特殊的语法来删除外键约束:

ALTER TABLE tbl_magazine_issue
  DROP FOREIGN KEY FK_tbl_magazine_issue_mst_users

【讨论】:

  • Postgres、MSSQL 和 Oracle 都有alter table .. drop constraint。 MySQL 似乎是个奇怪的人。
  • 它说它不能删除“column2”,因为在外键约束中需要它。当我按照你说的做时,我得到“Cant DROP column2;检查列/键是否存在”
  • 好吧,我明白了,外部是一个单独的东西,只是将列连接到其他表列。我的有一个标准名称。现在我现在也可以安全地删除外键,而不会删除列本身
  • Wellington Lorindo 的解决方案可以被视为更正确,因为简单地删除外键不会删除相关索引。当然,索引可能是单独创建的,但如果它是由于首先添加外键而创建的,则不会仅通过删除外键来删除它。
  • 同样的问题 -> 需要使用特定语法传递外键 id,对我来说:ALTER TABLE users DROP FOREIGN KEY users_ibfk_1 -> watch syntax [table name]_ibfk_1 -> 这个外键被赋予我的 SQL 请求抑制所引发的错误
【解决方案2】:

我遇到了同样的问题,我必须用这段代码来解决:

ALTER TABLE `table_name` DROP FOREIGN KEY `id_name_fk`;
ALTER TABLE `table_name` DROP INDEX  `id_name_fk`;

【讨论】:

  • 这可以被视为比公认的解决方案更正确,因为简单地删除外键不会删除索引。当然,索引可能是单独创建的,但如果它是由于首先添加外键而创建的,那么它不会仅仅通过删除外键而被删除。
  • 作为单个命令:ALTER TABLE table_name DROP FOREIGN KEY IF EXISTS id_name_fk, DROP INDEX IF EXISTS id_name_fk;
  • @FrankForte 的“单一命令”不能作为 MySQL(至少 5.7.28 和 AFAIK 8.0)不支持 DROP FOREIGN KEY IF EXISTS 语法。 MariaDB 支持它。
【解决方案3】:

在 MySQL 中没有 DROP CONSTRAINT 这样的东西。在您的情况下,您可以改用 DROP FOREIGN KEY

【讨论】:

    【解决方案4】:

    如果约束不是外键,例如。使用 'UNIQUE CONSTRAINT (colA, colB)' 添加一个,然后它是一个可以使用 ALTER TABLE ... DROP INDEX ... 删除的索引

    【讨论】:

      【解决方案5】:

      添加一点罗伯特奈特的回答,因为帖子的标题本身没有提到外键(并且因为他没有完整的代码示例,并且因为 SO 的评论代码块没有显示以及答案的代码块),我将为 unique 约束添加这个。这些都可以消除约束:

      ALTER TABLE `table_name` DROP KEY `uc_name`;
      

      ALTER TABLE `table_name` DROP INDEX `uc_name`;
      

      【讨论】:

        【解决方案6】:

        还不错,您可以暂时禁用 mysql 数据库中的所有外键检查: SET FOREIGN_KEY_CHECKS=0; 并再次启用它: SET FOREIGN_KEY_CHECKS=1;

        【讨论】:

          【解决方案7】:

          某些 ORM 或框架使用与默认 FK_[parent table]_[referenced table]_[referencing field] 不同的外键命名约定,因为它们可以更改。

          例如,Laravel 使用 [parent table]_[referencing field]_foreign 作为命名约定。您可以使用此查询显示外键的名称,如here 所示:

          SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
          WHERE REFERENCED_TABLE_SCHEMA = '<database>' AND REFERENCED_TABLE_NAME = '<table>';
          

          然后通过运行前面提到的 DROP FOREIGN KEY 查询及其正确名称来删除外键。

          【讨论】:

            【解决方案8】:

            对于那些使用 MariaDB 来这里的人:

            请注意,MariaDB 通常允许使用 DROP CONSTRAINT 语句,例如删除检查约束:

            ALTER TABLE table_name
            DROP CONSTRAINT constraint_name;
            

            https://mariadb.com/kb/en/library/alter-table/

            【讨论】:

            • 是的,这适用于同一个表中的约束,例如CONSTRAINT CHECK(a &gt; b)。对于外键约束,您似乎仍然需要 DROP FOREIGN KEY 语法,至少在 MariaDB 10.2 版中
            【解决方案9】:
            1. 转到表的结构视图
            2. 您将在顶部看到 2 个选项 a.表结构 b.关系视图
            3. 现在点击Relation view,在这里你可以删除你的外键约束。您将在这里获得所有关系。

            【讨论】:

            • 太好了,当你不知道 id 时为我工作
            【解决方案10】:

            移除约束最简单的方法是使用MySQL 8.0.19中引入的语法ALTER TABLE tbl_name DROP CONSTRAINT symbol;

            从 MySQL 8.0.19 开始,ALTER TABLE 允许更通用(和 SQL 标准)语法来删除和更改任何类型的现有约束,其中约束类型由约束名称确定

            ALTER TABLE tbl_magazine_issue DROP CONSTRAINT FK_tbl_magazine_issue_mst_users;
            

            db<>fiddle demo

            【讨论】:

              【解决方案11】:

              MySql 中没有DROP CONSTRAINT。在 mysql 5.7 中这项工作就像魔术一样

              ALTER TABLE answer DROP KEY const_name;
              

              【讨论】:

                【解决方案12】:

                这将适用于 MySQL 以删除约束

                alter table tablename drop primary key;
                
                alter table tablename drop foreign key;
                

                【讨论】:

                • DROP PRIMARY KEY 不应该工作。 DROP FOREIGN KEY 有效,但您需要指定 drop 的对象。例如ALTER TABLE tablename DROP FOREIGN KEY id_name_fk
                猜你喜欢
                • 2023-03-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-12-25
                • 2021-08-03
                • 2020-12-09
                • 2011-07-26
                相关资源
                最近更新 更多