如何从我的MySQL表删除约束?

我想从表中移除约束条件。我的问题是:

ALTER TABLE `tbl_magazine_issue`
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users`

但是我得到了一个错误:

#1064 -你的SQL语法有错误;查看MySQL服务器版本对应的手册,在第一行使用'constraint FK_tbl_magazine_issue_mst_users'附近的正确语法

341901 次浏览

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

ALTER TABLE tbl_magazine_issue
DROP FOREIGN KEY FK_tbl_magazine_issue_mst_users

在MySQL中没有DROP CONSTRAINT这样的东西。在你的情况下,你可以使用DROP FOREIGN KEY代替。

我也遇到过同样的问题,我用下面的代码来解决:

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

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

这将在MySQL上工作以删除约束

alter table tablename drop primary key;


alter table tablename drop foreign key;
  1. 进入表
    的结构视图
  2. 你会在顶部a.看到2个选项表结构b.关系视图
  3. 现在单击关系视图,在这里您可以删除外键约束。在这里你会得到所有的关系。

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

例如Laravel使用[parent table]_[referencing field]_foreign作为命名约定。你可以使用这个查询来显示外键的名称,如在这里所示:

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

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

为了给Robert Knight的答案补充一点,因为文章的标题本身没有提到外键(而且他的文章没有完整的代码示例,而且SO的注释代码块没有答案的代码块显示得好),我将为独特的约束添加这个。这两种方法中的任何一种都可以去除约束:

ALTER TABLE `table_name` DROP KEY `uc_name`;

ALTER TABLE `table_name` DROP INDEX `uc_name`;
同样不错,你可以暂时禁用mysql数据库中的所有外键检查: 设置FOREIGN_KEY_CHECKS = 0; 并再次启用它: 设置FOREIGN_KEY_CHECKS = 1; < /代码> < / p >

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

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

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

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

删除constraint最简单的方法是使用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<>小提琴demo

在MySQL中,你必须指定你想要删除的约束类型:

例子:

  CONSTRAINT `shop_ibfk_1` FOREIGN KEY (`fb_user_id`) REFERENCES `fb_user` (`id`),
CONSTRAINT `shop_chk_1` CHECK ((`import_lock` in (0,1)))

第一个你可以用:

alter mytable shop drop FOREIGN KEY `shop_ibfk_1`;

第二个是

alter mytable drop CHECK `shop_chk_1`;