微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何删除MySQL中的唯一约束?

如何解决如何删除MySQL中的唯一约束?

我在网上搜索了如何去除MysqL中的唯一约束,找到了很多解决方法

  1. DROP INDEX index_name ON table_name;
    
  2. ALTER TABLE table_name
    DROP INDEX index_name;
    
  3. ALTER TABLE table_name
    DROP CONSTRAINT constraint_name; 
    

所有这些查询之间有什么区别?以下哪个查询符合标准 sql

另外,唯一约束、唯一索引和唯一键之间有什么区别?

Screenshot of MySQL glossary; link: https://dev.mysql.com/doc/refman/8.0/en/glossary.html

解决方法

许多 SQL 用户没有意识到索引不在 SQL 标准中。

继续,尝试在 ANSI/ISO SQL 规范中查找 CREATE INDEX、DROP INDEX 或任何其他相关索引语法。

约束在规范中。以下是“SQL-99,完整,真的”一书在线版本中对 UNIQUE CONSTRAINT 的介绍的链接

UNIQUE 约束描述了对在给定表上执行的 INSERT/UPDATE/DELETE 操作行为的逻辑限制。也就是说,在约束中命名的唯一列中,没有两行可以具有相同的非 NULL 值。

但索引是一个实现细节,SQL 标准将实现细节留给供应商。

恰巧添加索引数据结构是让约束的实现有希望高效的最常见方式。因此,几乎所有 SQL 供应商都具有某种类似的功能,他们使用必要的语句和子句扩展 SQL 语法以支持索引。

坦率地说,供应商之间的索引语法如此相似真是一个奇迹。这给用户的印象是供应商正在遵守 SQL 标准的某些部分。他们不是;他们只是在模仿早期的实现。


重新评论:

这两个查询完成相同的事情。没有语义上的区别,只有语法上的区别。

DROP INDEX index_name ON table_name;

ALTER TABLE table_name
DROP INDEX index_name;

例如,使用 ALTER TABLE,您可以将删除索引与对同一表的其他更改操作结合起来,例如删除多个索引、创建新索引或任何其他更改。

但是 DROP INDEX 只允许你删除一张表上的一个索引。

然后第三个查询删除一个约束。约束不是索引。

ALTER TABLE table_name
DROP CONSTRAINT constraint_name; 

这可能会导致删除索引,但不一定。这取决于您要删除的约束类型。例如,删除 UNIQUE 约束会隐式删除与该约束关联的索引。而删除 FOREIGN KEY 或 CHECK 约束不会删除同一列上的索引。

,
DROP INDEX index_name ON table_name;

ALTER TABLE table_name
DROP INDEX index_name;

完全一样。此外,第一个查询确实映射到第二个。


ALTER TABLE table_name
DROP CONSTRAINT constraint_name; 

执行另一个功能。

索引是表内的结构。 DROP INDEX 删除索引(抱歉...)。

Constraint 是表内的一条规则,这条规则可能伴随着相应的索引创建,用于约束维护。 DROP CONSTRAINT 删除约束。但是,如果为其维护创建了索引,则不会删除该索引。见fiddle

,

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

  • 删除名为符号的现有约束:
    ALTER TABLE tbl_name
        DROP CONSTRAINT symbol;
    

Source

SQL 标准规定所有类型的约束(主键、唯一索引、外键、检查)都属于同一个命名空间。在 MySQL 中,每个约束类型每个模式都有自己的命名空间。因此,每种类型的约束的名称对于每个模式必须是唯一的,但不同类型的约束可以具有相同的名称。当多个约束具有相同的名称时,DROP CONSTRAINTADD CONSTRAINT 不明确并发生错误。在这种情况下,必须使用特定于约束的语法来修改约束。例如,使用 DROP PRIMARY KEY 或 DROP FOREIGN KEY 删除主键或外键。
Source

因此,从技术上讲,在 MySQL 8.0.19 或更高版本上,我们可以使用 ALTER TABLE tbl_name DROP CONSTRAINT constraint_name 删除 UNIQUE 约束。但是,如果其他约束与 UNIQUE 约束同名,则此方法将不起作用。在这种情况下,我们必须使用 ALTER TABLE tbl_name DROP INDEX index_nameDROP INDEX index_name ON tbl_name 来移除 UNIQUE 约束。

ALTER TABLE tbl_name DROP INDEX index_nameDROP INDEX index_name ON tbl_name 之间的区别已在 this answer 中说明。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。