主键的唯一性确保每条记录可被唯一标识,具有唯一性和非空性,区别于唯一索引的是其不允许NULL且每表仅一个,复合主键通过列组合保证唯一,冲突时可用INSERT IGNORE、REPLACE INTO或ON DUPLICATE KEY UPDATE处理,是数据完整性和查询效率的基础。

在mysql数据库中,主键(Primary Key)的唯一性是一个核心概念,它确保了每条记录在表中都可以被唯一标识。主键一旦设定,其对应的列或列组合中的值必须是唯一的,且不允许为NULL。
主键的基本特性
主键具有两个关键属性:唯一性和非空性。
- 唯一性:主键列中的每一个值都必须与其他行不同,不能重复。
- 非空性:主键列不允许插入NULL值,每一行都必须有一个明确的主键值。
这两个特性共同保证了数据行的可识别性,是实现数据完整性的重要机制。
主键与唯一索引的区别
虽然唯一索引(Unique Index)也能保证列值的唯一性,但它与主键有本质区别。
- 一张表只能定义一个主键,但可以有多个唯一索引。
- 唯一索引允许包含一个NULL值(具体取决于存储引擎和版本),而主键绝对不允许NULL。
- 主键会自动创建聚集索引(InnoDB引擎下),对查询性能影响更大。
复合主键的唯一性控制
当主键由多个列组成时,称为复合主键。此时,唯一性是基于所有主键列的组合来判断的。
例如,一个订单明细表使用(订单ID, 商品ID)作为复合主键:
- 同一个订单ID可以出现多次,只要搭配不同的商品ID。
- 只有当两个字段的组合完全相同时,才会违反唯一性约束。
这种设计适合多对多关系的数据建模场景。
主键冲突的处理方式
当插入或更新数据导致主键重复时,MySQL会抛出错误(如Error 1062)。常见的应对策略包括:
- 使用 INSERT IGNORE 忽略重复数据。
- 使用 REPLACE INTO 先删除再插入新记录。
- 使用 INSERT … ON DUPLICATE KEY UPDATE 实现存在则更新的操作。
选择哪种方式取决于业务逻辑对数据一致性的要求。
基本上就这些。主键的唯一性不仅是数据库设计的基础规则,也是高效查询和关联操作的前提。合理设置主键能有效避免数据冗余和异常。不复杂但容易忽略。