SQL表是否可以同时拥有单列主键与多列复合键?
问题解答
概念澄清
首先需要明确一个常见的概念误区:我们常说的「复合键」并非和主键平级的约束类型,而是泛指由2个及以上字段组合构成的约束,它可以用作主键、唯一键、外键等不同约束类型。
通用SQL体系规则
- 每张SQL数据表有且只能配置1个主键约束,主键本身既可以是单字段的,也可以是多字段复合的
- 如果你提到的「复合键」是指除主键外、由多字段组成的唯一约束/唯一键,那么完全可以和主键同时存在,没有冲突
SQL Server环境下的实操结论
如果你已经为表设置了单字段主键,完全可以在其他字段上额外设置复合约束,最常见的就是复合唯一键、复合外键,符合业务规则即可。
你可以参考以下示例代码操作:
-- 示例1:创建表时同时设置单字段主键+复合唯一约束 CREATE TABLE Employee ( EmpId INT PRIMARY KEY, -- 单字段主键 DeptId INT NOT NULL, EmpCode VARCHAR(20) NOT NULL, EmpName VARCHAR(50) NOT NULL, -- 额外设置复合唯一约束(也就是你所说的复合键) CONSTRAINT UQ_Dept_EmpCode UNIQUE (DeptId, EmpCode) ); -- 示例2:已存在的表追加复合唯一约束 ALTER TABLE Employee ADD CONSTRAINT UQ_Dept_EmpCode UNIQUE (DeptId, EmpCode);
注意事项
- 主键自带全局唯一、非空的属性,整表仅允许存在一个,所以不能在已有单字段主键的前提下再新增另一个复合主键
- 复合唯一约束可以配置多个,只要字段组合不重复即可,未显式设置非空的字段组合最多允许存在一行全为NULL的记录
内容的提问来源于stack exchange,提问作者Ali Hussain
相关产品推荐
相关产品推荐

