【发布时间】:2010-12-17 13:05:16
【问题描述】:
SQL表可以有多列带主键吗?
【问题讨论】:
标签: sql
SQL表可以有多列带主键吗?
【问题讨论】:
标签: sql
一个表可以只有一个主键约束,但它可能由多个列组成,例如
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)
);
【讨论】:
如果您的意思是“SQL 中的主键可以有多个列”,答案是肯定的。
【讨论】:
如果您要问一个表是否可以有多个列作为主键,那么对于 MS SQL Server,答案是肯定的,它被称为复合(更正)键。
【讨论】:
“通常复合键是一种不好的做法。”
提防那些试图向你推销这些垃圾的假先知。
钥匙就是钥匙就是钥匙就是钥匙。一个键IS 是一组属性。不多也不少。该集合的基数可以是 1,也可以 >1,甚至可以为零!并且一个键一对一地对应于一些唯一性约束。
关系模型没有规定键/唯一性约束只能涉及单个属性。
此外,关系模型也没有任何反对存在多个键的限制,甚至关系理论已经抛弃了“主键”的概念(几十年来)(暗示这样的“主”键在任何意义上都比其他键“更像键”),因为完全没有必要且无关紧要。就键所暗示的唯一性而言,所有键都是平等的(并不是一个特定的键比其他键更平等)。
【讨论】:
通常复合键是一种不好的做法。当你需要加入它时,它会导致事情变慢。当您需要更新 27 个子表中的一个或多个字段时,这也更加困难。更好的做法是在通常构成复合键的字段上使用代理键和唯一索引。然后你有整数连接的速度和唯一的属性保持不变,当键值发生变化时(就像在复合键中经常发生的那样),你只需要更改一个表而不是所有子表。
虽然有一个地方我会使用复合键,那就是一个映射表,用于为多对多关系创建关系。在这种情况下,您通常只有两列,并且通常都是整数,通常不会更改。然后我通常会使用复合键,因为这种特殊情况没有复合键在普通表中的缺点。
【讨论】: