主键(Primary Key)是唯一标识每行的非空字段,每表只能有一个; 唯一键(Unique Key)是保证字段值唯一,但允许为NULL,每表可有多个。
主键 (Primary Key)
定义:用于唯一标识表中每一行数据的字段或字段组合,是表的核心标识。
作用:为其他表提供关联引用的核心字段,唯一标识表中的每一行数据。
特点
唯一性:所有主键值必须唯一,不可重复。 非空性:主键字段禁止为 NULL。 单例性:每张表仅能定义一个主键(但可以是多字段的联合主键)。 索引支持:数据库一般会为主键自动创建索引来提高查询效率。
唯一键 (Unique Key)
定义:用于确保字段或字段组合的值唯一,但非表的唯一标识。
作用:提供辅助的唯一性约束,便于业务逻辑使用。确保指定列或列组合在表中的数据唯一,防止重复数据产生。
特点
唯一性:字段值不可重复,但允许 NULL,具体可允许多少个 NULL,取决于数据库实现,如 MySQL 可以有多个。 多例性:一张表可定义多个唯一键,用来约束不同的业务属性。 索引支持:数据库也通常会为唯一键创建索引,提高检索速度。
主要区别
数量限制
主键:每张表只能有一个。 唯一键:一张表可以定义多个。
用途侧重
主键:这一列(或列组合)在逻辑上就是记录的“身份证”,最常用来建立实体与实体间的关联。 唯一键:更多是防止重复数据,保证业务字段(如邮箱、手机号等)具有唯一性,但并非必然用作数据行的主标识。
约束规则
主键:强制非空(NOT NULL),插入数据时必须显式指定值,但若设置 AUTO_INCREMENT,MySQL 会自动分配下一个可用值。插入后通常不推荐更新主键值。 唯一键:允许 NULL 值,例如:MySQL允许多个 NULL视为不冲突而SQL Server仅允许一个 NULL。值可更新,但需保证新值唯一。
索引与性能
主键:默认创建聚集索引(如 MySQL InnoDB 、SQL Server),物理上按主键顺序存储数据,范围查询非常高效。 唯一键:默认创建非聚集索引,逻辑上维护唯一性,适合等值查询。
简单示例
主键场景:在“用户表”中,UserID 作为主键,保证每位用户都能被独一无二地识别和引用。 唯一键场景:在同一个用户表中,Email 字段也要求不能重复时,就可以为 Email 设置唯一键;此时允许它为 NULL,但实际业务上通常会要求非 NULL 并且唯一。 总结
主键和唯一键都用于保证数据唯一性,但主键更侧重于表的标识和引用,而唯一键更侧重于业务属性的唯一性约束。在实际应用中,通常会结合使用两者来实现数据完整性和业务规则的约束。
主键其实就是用来标识每行数据身份的核心字段或字段组合,必须保证主键值的非空性和唯一性。非空性是指插入主键值数据时必须显式指定值,但如果设置了自增(AUTO_INCREMENT),插入数据时就不用手动指定值,数据库会自动分配下一个可用的数值,另外通常不建议在插入后再去修改主键。唯一性是指主键值数据整能够唯一标识表中的一行,此外数据库一般会自动给它创建聚簇索引。
相比之下,唯一键虽然也要保证相应字段的值的唯一性,但它更偏向业务层面的唯一性控制,不一定要当成每行数据的主识别字段。它允许为空,而且在不同的数据库里,对空值的处理也不一样,有的可以插入多个空值,例如MySQL。有的只能插一次,例如SQL Server 。一个表中可以同时存在多个唯一键,每个唯一键都会有对应的非聚簇索引来提升检索效率,这样就能在业务里确保不同属性都能做到唯一。
两者主要区别,首先是每张表只能有一个主键,但可以有多个唯一键。
其次是主键一定不能为空,而唯一键通常允许空值。
还有,主键往往是用来跟别的表建立关联,比如用户表中的 UserID 作为主键,就能让其他表引用这个字段来关联用户信息。唯一键更多是防止个别业务字段的重复,比如用户表中的 Email 地址如果也要求唯一,可以设置成唯一键,这样就能保证任何两个用户都不会用到相同的邮箱。
最后,数据库在主键和唯一键上也有不同的索引方式,InnoDB 或 SQL Server 的主键会采用聚集索引,让物理存储和主键顺序相关联,范围查询时会更高效;而唯一键通常是非聚集索引,比较侧重等值查询。
总之,主键和唯一键都用于保证数据唯一性,但主键更侧重于表的标识和引用,而唯一键更侧重于业务属性的唯一性约束。在实际应用中,通常会结合使用两者来实现数据完整性和业务规则的约束。