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


252

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

ALTER TABLE `tbl_magazine_issue` 
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users`

但是我得到一个错误:

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


1
值得注意的是,如果您创建了CHECK约束,则无需删除它,因为不会创建任何实际约束。您可以选择information_schema.table_constraints进行验证,甚至可以add constraint一遍又一遍地运行,而不会出现任何错误。MySQL不支持CHECK约束,但允许用于创建约束的SQL(实际上没有创建约束)。
ADTC



您的语法是完全有效的,现在受支持的演示
Lukasz Szozda

Answers:


423

MySQL具有删除外键约束的特殊语法:

ALTER TABLE tbl_magazine_issue
  DROP FOREIGN KEY FK_tbl_magazine_issue_mst_users

21
Postgres,MSSQL和Oracle都有alter table .. drop constraint。看来,MySQL是一个奇怪的例子。
Jared Beck

它说它不能删除“ column2”,因为在外键约束中需要它。当您按照我说的去做时,我得到“无法删除column2;请检查该列/键是否存在”
Lealo

好吧,我明白了,将表列连接到其他表列是一个独立的过程。矿井有一个标准名称。现在我现在也可以安全地删除外键,而不必删除列本身
Lealo

1
惠灵顿·洛林多(Wellington Lorindo)的解决方案似乎更正确,因为仅删除外键不会删除相关索引。当然,索引可能是单独创建的,但是如果首先创建索引是由于添加外键而创建的,那么仅通过删除外键就不会删除该索引。
Rich Harding

55

我有同样的问题,我必须用以下代码解决:

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

2
这可能比接受的解决方案更正确,因为仅删除外键不会删除索引。当然,索引可能是单独创建的,但是如果它是由于首先添加外键而创建的,则不会仅仅通过删除外键将其删除。
Rich Harding

3
作为一个命令: ALTER TABLE table_name DROP FOREIGN KEY IF EXISTS id_name_fk, DROP INDEX IF EXISTS id_name_fk;
Frank Forte

26

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


12

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


9

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


8

为了给罗伯特·奈特(Robert Knight)的答案增加一点点,因为帖子的标题本身没有提到外键(并且由于他的标题没有完整的代码示例,并且由于SO的注释代码块的显示效果不及答案的代码好,块),我将其添加为唯一约束。这些工作之一都可以消除约束:

ALTER TABLE `table_name` DROP KEY `uc_name`;

要么

ALTER TABLE `table_name` DROP INDEX `uc_name`;

4

某些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查询及其专有名称来删除外键。



1
  1. 转到表格的结构视图
  2. 您将在顶部看到2个选项a。表结构b。关系视图
  3. 现在单击“ 关系”视图,在这里您可以删除外键约束。您将在这里获得所有联系。

太好了,您不知道身份证
号码

0

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

ALTER TABLE answer DROP KEY const_name;

0

消除约束的最简单方法是使用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演示


-4

这将在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
RousseauAlexandre
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.