单表能否设置两个独立的primary key列(非复合主键)
核心结论
哪怕两个列各自都完全满足非空、全表取值唯一的主键基础要求,你也绝对没法把两个独立的列分别设置成单表的主键——这是所有符合ANSI SQL规范的关系型数据库的强制硬性规则,没有任何变通空间。
底层规则拆解
- 主键是表级的整表唯一标识约束,从来不是某一列的个人属性。SQL标准从设计层面就明确要求:单张表最多只能存在1个主键约束,根本不存在给两个独立列分别挂主键的合法语法位置。
- 当一列能做到全表非空、取值唯一时,它在逻辑上属于「候选键」,只是具备了当主键的资格,不是必须要给它挂主键约束。如果表有多个符合要求的候选键,你只需要从中选一个当主键,剩下的列单独加
NOT NULL+UNIQUE约束,就能完全保留它非空、唯一的业务特性,完全没必要硬给它套主键的定义。 - 这里要明确划清和复合主键的边界:就算你把两个列绑定成联合的复合主键,本质上这还是1个主键约束,和题目要求的“两个独立列分别当主键”的场景完全不沾边,根本不算绕过单表单主键的限制。
常见踩坑提醒
很多人容易搞混“能当主键”和“能设置成主键”的区别:
- 列满足非空、唯一只是能当主键的必要条件,不是你想给哪个列加主键就能加的。
- 如果你真的尝试在两个独立列上分别执行设置主键的操作,数据库会直接抛出类似
Multiple primary key defined/Table already has a primary key的错误,操作根本执行不下去,和这两个列本身的数据合规性没有任何关系。
内容的提问来源于stack exchange,提问作者Aurobinda Mohanty
相关产品推荐
相关产品推荐

