如何删除MySQL中的唯一约束?
我在网上搜索如何去除MySQL中的唯一约束,发现了很多解决方案。
-
DROP INDEX index_name ON table_name; -
ALTER TABLE table_name DROP INDEX index_name; -
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 约束不会删除同一列上的索引。