如何删除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; 
    
    ALTER TABLE table_name
    DROP CONSTRAINT constraint_name; 
    

所有这些查询之间有什么区别?这些查询中的哪一个是根据标准 SQL 的?

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

回答

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

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

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

  • https://crate.io/docs/sql-99/en/latest/chapters/20.html#constraint-type-unique-constraint
  • https://crate.io/docs/sql-99/en/latest/chapters/20.html#dropping-constraints

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 只允许您删除一张表上的一个索引。

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

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


以上是如何删除MySQL中的唯一约束?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>