SQL表可以有多个带主键的列吗?

时间:2009-11-17 17:10:24

标签: sql

SQL表可以有多个带主键的列吗?

5 个答案:

答案 0 :(得分:32)

一个表只能有一个主键约束,但可以包含多个列,例如

create table my_table (col1 integer, col2 integer, col3 integer,
   primary key (col1, col2, col3)
   );

除主键外,表还可能有一个或多个UNIQUE约束,例如

create table my_table2 (col1 integer, col2 integer, col3 integer,
   primary key (col1, col2),
   unique (col2, col3)
   );

答案 1 :(得分:26)

如果您的意思是“ SQL中的主键可以有多列”,答案是肯定的。

答案 2 :(得分:7)

如果你问一个表是否可以有多个列作为主键,那么对于MS SQL Server,答案是肯定的,它被称为复合(纠正)密钥。

答案 3 :(得分:5)

“通常复合键是一种糟糕的做法。”

要小心那些试图向你出售这种废话的假先知。

一个关键是关键是关键是关键。密钥 IS 一组属性。没有更多,也没有更少。该集合的基数可以是1,或者它可以是> 1,它甚至可以是零!并且一个键一对一地对应于一些唯一性约束。

关系模型没有处方,因为密钥/唯一性约束只能涉及单个属性。

此外,关系模型也没有任何前景,因为有一个以上的密钥,而关系理论已经抛弃了(几十年来已经存在的)“主键”的概念(暗示,这种“主要”密钥在任何意义上都是“比其他密钥更重要”,因为完全不必要和无关紧要。就关键所暗示的唯一性而言,所有键都是平等的(并不是一个特定键比其他键更平等的情况)。

答案 4 :(得分:0)

通常复合键是不好的做法。当你需要加入它时会导致事情变慢。当您需要更新27个子表中的一个或多个字段时,它也更难。更好的做法是代理键和通常构成组合键的字段上的唯一索引。然后,您具有整数连接的速度,并且维护唯一属性,并且当键值更改时(通常在复合键中),则您只需更改一个表而不是所有子表。

我会在一个地方使用复合键,这是一个映射表,用于创建多对多关系的实现关系。在这种情况下,您通常只有两列,并且通常都是通常不会更改的整数。然后我通常会使用复合键,因为这个特殊情况没有复合在普通表中的缺点。