复合主键的单个属性字段是否必须唯一?附SQL示例
复合主键的单个字段是否需要唯一?
嗨,这个问题其实挺常见的,咱们直接说结论:不需要。
复合主键的核心要求是多个字段的组合值必须唯一,以此来唯一标识表中的每一行,但单个字段本身完全可以重复——只要它们和主键里的其他字段组合起来不重复就行。
拿你给出的表结构举例:
CREATE TABLE example ( a integer, b integer, c integer, PRIMARY KEY (a, c) );
你完全可以插入以下几条数据,它们都是符合约束的:
INSERT INTO example (a, b, c) VALUES (1, 10, 2); INSERT INTO example (a, b, c) VALUES (1, 20, 3); INSERT INTO example (a, b, c) VALUES (2, 30, 2);
看这里,字段a重复出现了两次1,字段c也重复出现了两次2,但(a,c)的组合(1,2)、(1,3)、(2,2)都是独一无二的,完全满足复合主键的要求,数据库会正常接受这些插入操作。
如果你的业务需求里需要某个单个字段(比如a)必须唯一,那你得单独给这个字段添加UNIQUE约束,比如把表结构改成:
CREATE TABLE example ( a integer UNIQUE, b integer, c integer, PRIMARY KEY (a, c) );
但这属于额外的约束要求,和复合主键本身的规则无关。
内容的提问来源于stack exchange,提问作者Orestis
相关产品推荐
相关产品推荐

