MySQL中的唯一约束

Posted

技术标签:

【中文标题】MySQL中的唯一约束【英文标题】:Unique constraint in MySQL 【发布时间】:2010-11-16 02:18:58 【问题描述】:

默认情况下,唯一约束是索引吗?如果不是,在SELECT ... WHERE 子句中使用唯一约束时,它是否具有与索引列相同的性能结果?

谢谢

【问题讨论】:

【参考方案1】:

在开始使用唯一约束之前检查主键约束。

主键约束相当于声明一个唯一约束和一个非空约束。如果主键中有多个列,则每一列都有一个非空约束,但唯一约束适用于所有列。

当您声明主键时,DBMS 将为您创建一个索引。如果您愿意,您可以删除索引,但是当 DBMS 进行表扫描以检查唯一性时,您将获得糟糕的性能。

主键约束强制实体完整性,而 REFERENCES(外键)约束强制参照完整性。它们一起在确保数据完整性方面大有帮助。

【讨论】:

【参考方案2】:

UNIQUE 实际上是 on 一个索引的约束,所以是的,UNIQUE 意味着在您强制唯一性的字段上有一个索引。

【讨论】:

所以现在我又困惑了,我应该在我的创建表中放入以下内容:唯一(电子邮件)还是:唯一索引(电子邮件)?【参考方案3】:

唯一性约束是一种表达某事物(如属性值的某种组合)在整个关系(“表”)范围内必须是唯一的事实的方式。

这是在逻辑设计级别。

索引是帮助强制执行此类约束的一种可能有用的方法。

这是在物理设计级别。

某些 DBMS 产品可能会根据某些逻辑设计构造(例如 UNIQUE 约束)的存在来推断某些物理设计构造(例如某些索引的存在)。其他人可能不会。

【讨论】:

【参考方案4】:

唯一约束必然是索引。您通常将其定义为“唯一索引”。在任何情况下都需要一个索引来有效地实现唯一约束,因此拥有一个索引并不是缺点。

【讨论】:

【参考方案5】:

约束实际上与索引非常不同:它只是说 mysql 应该为您强制执行唯一性。然而,索引(尽管它可以是唯一的)与硬盘上的物理顺序有关,或者与允许在列上有效搜索的其他结构(通常是树)有关。

但是,您可能会将所有这些与定义(通常是聚集的)唯一索引的主键混淆。

【讨论】:

所以可以说在我的表中我有一列“email”,我做了几次查询“select * from tbl where email like 'something'”。此列是唯一列,但它不是主键。那么我索引它会更好的性能吗? @Kai:是的,索引会在读取数据时提高性能(写入数据可能会受到阻碍)。唯一约束仅意味着对于表中的所有行,为其定义了唯一约束的列中的值将是唯一的 - 没有两个电子邮件列的值会相同。

以上是关于MySQL中的唯一约束的主要内容,如果未能解决你的问题,请参考以下文章

Mysql数据唯一约束与唯一索引案例总结及踩坑记(含NULL值与唯一约束唯一索引的搭配使用)

mysql唯一约束

MySql -- UNIQUE唯一约束

如何为 MySQL 中的多个列指定唯一约束?

mysql中的unique是约束还是索引?

MySQL约束 主键约束丨唯一约束丨非空约束丨外键级联