【问题标题】:Can SQL table have multiple columns with primary key? [duplicate]SQL表可以有多个带有主键的列吗? [复制]
【发布时间】:2010-12-17 13:05:16
【问题描述】:

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

【问题讨论】:

    标签: sql


    【解决方案1】:

    一个表可以只有一个主键约束,但它可能由多个列组成,例如

    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)
       );
    

    【讨论】:

    • 虽然一张表只能有一个主键,(只是根据定义)它可以有任意数量的键,其中任何一个都可以指定为主键。 (其他的都将被称为“备用”键)
    • 有趣..所以如果一个唯一键位于多个列上,这是否意味着 col2.col3 是唯一的(一起)还是意味着 col2 是唯一的而 col3 是唯一的?
    • 一起。 Unique(col2) 和 unique(col3) 将是 2 个单独的约束。
    【解决方案2】:

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

    【讨论】:

    • 谢谢!是的,这就是我的意思
    • 另一个好问题是主键应该是多列。 :)
    • 嗯,这是一个不同的问题,答案是否定的,永远不会,如果你这样做,我会追捕你并伤害你。当然,这只是个人喜好:-)
    【解决方案3】:

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

    【讨论】:

    • @Charles 谢谢!已编辑。
    【解决方案4】:

    “通常复合键是一种不好的做法。”

    提防那些试图向你推销这些垃圾的假先知。

    钥匙就是钥匙就是钥匙就是钥匙。一个键IS 是一组属性。不多也不少。该集合的基数可以是 1,也可以 >1,甚至可以为零!并且一个键一对一地对应于一些唯一性约束。

    关系模型没有规定键/唯一性约束只能涉及单个属性。

    此外,关系模型也没有任何反对存在多个键的限制,甚至关系理论已经抛弃了“主键”的概念(几十年来)(暗示这样的“主”键在任何意义上都比其他键“更像键”),因为完全没有必要且无关紧要。就键所暗示的唯一性而言,所有键都是平等的(并不是一个特定的键比其他键更平等)。

    【讨论】:

    • -1。不,并非所有键都相等...对于外键查找,复合键比单列键慢。并且“自然”键(基于真正的域模型数据定义)本质上不同于无意义的代理键(除了无意义的表行值唯一性之外,它在任何方面都不相同)。当两者都需要时使用两者。
    • 我不知道应该投赞成票还是反对票。我同意第一部分,但我不同意所有键都是平等的。根据定义,主键必须是唯一的。外键可以为空、使用一次(一对一关系)或重复使用(无论数据库设计要求什么)。
    • 所有定义唯一性的键都是唯一的。外键不是定义唯一性的键。我不是在说那些。将这个概念称为“钥匙”是一个巨大的错误。自然,如果您对某个 relvar/table/entity 使用复合键,而在另一个 relvar/table/entity 中您必须“引用”前者,那么在该“其他”relvar/table 中将需要一个复合外键/实体。
    【解决方案5】:

    通常复合键是一种不好的做法。当你需要加入它时,它会导致事情变慢。当您需要更新 27 个子表中的一个或多个字段时,这也更加困难。更好的做法是在通常构成复合键的字段上使用代理键和唯一索引。然后你有整数连接的速度和唯一的属性保持不变,当键值发生变化时(就像在复合键中经常发生的那样),你只需要更改一个表而不是所有子表。

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

    【讨论】:

    • 为了说明一点,(但我认为这是一个重要的)键有两个不同的目的。 1. 表中的唯一键确保表内数据的一致性(没有逻辑上重复的行)。为此,如果“自然键”是复合的,则该键是复合的。故事结局。没有其他“更简单”的键可以确保数据的一致性。但是这个函数对性能没有影响,所以使用正确的复合键不会影响性能。
    • 2.其次,Unique Keys(Prim 或 Alternative)用作相关表中外键的目标,以确保存在 Foerign Key 值。为此,密钥越短,性能越好。因此,使用不包含任何意义的非自然(或代理)键来完成第二个目的可以提高性能。那么为什么不在两个需求都存在并且自然键是复合的或太长而无法发挥性能的地方同时使用呢??
    • 下次尝试回答提出的问题。问题是“SQL 表可以有多个带有主键的列吗?”不是“拥有复合键是个好主意吗?”
    猜你喜欢
    • 1970-01-01
    • 2014-01-11
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多