【问题标题】:2 primary keys in a table表中的 2 个主键
【发布时间】:2011-12-12 08:17:00
【问题描述】:

在数据库中的表中创建主键很好。制作复合初级也很好。但是为什么我不能在一个表中有 2 个主键?如果我们有 2 个主键,可能会出现什么样的问题。

假设我有一个学生表。我不希望每个学生的卷号和姓名都是唯一的。那为什么我不能在一个表中创建 2 个主键呢?我现在没有看到任何逻辑问题。但我肯定错过了一个严重的问题,这就是它不存在的原因。

我是数据库新手,所以不太了解。相反,它也可能会产生技术问题。如果有人可以教育我,我会很高兴。

谢谢。

【问题讨论】:

标签: database primary-key


【解决方案1】:

在第二个属性(Names)上创建一个唯一索引,它几乎和主键的名字一样。

来自维基百科 (http://en.wikipedia.org/wiki/Unique_key):

一张表最多可以有一个主键,但可以有多个唯一键 钥匙。主键是唯一指定的列的组合 一排。这是唯一键的特例。一个区别是 主键具有隐式 NOT NULL 约束,而唯一键则具有 不是。因此,唯一键列中的值可能是也可能不是 NULL, 事实上,这样的一列最多可能包含一个 NULL 字段。 另一个区别是必须使用另一个定义主键 语法。

【讨论】:

  • 唯一约束/索引与 PK 不同,唯一性允许 NULL 并且您只能拥有一个 PK。
  • @mu,为了在 SQL 中强制执行键,UNIQUE 约束 与 PRIMARY KEY 相同。没有键允许空值。正如您所指出的,唯一的区别是 PRIMARY KEY 约束不能在每个表中多次使用这一毫无意义的限制。
  • @dportas:这取决于 DBMS。 AFAIK MSSQL 不允许多个 NULL,但 MySQL 允许:“对于所有引擎,UNIQUE 索引允许包含 NULL 的列的多个 NULL 值”dev.mysql.com/doc/refman/5.5/en/create-table.html
  • @palacsint。对于一个键,所有相关的列都必须有一个 NOT NULL 约束。使用 UNIQUE 约束不会改变这一点,因此不会出现空值问题。
【解决方案2】:

您可以为两个列 UNIQUE(roll,name) 创建一个 UNIQUE 约束。

【讨论】:

    【解决方案3】:

    根据定义,PK 是unique,因为它用于从其他行中识别一行,例如,当外键引用该表时,它正在引用 PK。

    如果您需要另一列像 PK 一样“行动”,请为其指定属性 uniquenot null

    【讨论】:

      【解决方案4】:

      嗯,这只是根据定义。不能有两个“主要”条件,就像不能有两个“最新”版本一样。

      每个表可以包含多个 unique 键,但如果您决定拥有一个主键,这只是其中一个 unique 键,您认为“最重要”的“一个”,它标识每条记录都是唯一的。

      如果您有一张表并得出结论认为您的主键不能唯一标识每条记录(也意味着不能有两条主键值相同的记录),那么您选择了错误的主键key,根据定义,主键的字段必须唯一地定义每条记录。

      但是,这并不意味着没有其他字段组合可以唯一标识记录!这就是第二个功能发挥作用的地方:参照完整性。

      您可以使用它们的主键“链接”表。例如:如果您有一个Customer 表和一个Orders 表,其中Customers 表有一个客户编号的主键,Orders 表有一个订单号和客户编号的主键,这意味着:

      1. 每个客户都可以通过其客户编号进行唯一标识
      2. 每个订单都由订单号和客户号唯一标识

      然后您可以在客户编号上链接这两个表。然后,数据库系统确保了几件事,其中一个事实是,如果不先删除订单,您就无法删除在数据库中有订单的客户。否则,您将在无法找到客户数据的情况下下订单,这将违反数据库的引用完整性。

      如果您有两个主键,系统将不知道在哪个主键上确保参照完整性,因此您必须告诉系统使用哪个键 - 这会使其中一个主键更重要,这会使它是主键的“主键”(!)。

      【讨论】:

      • 引用完整性约束可以引用表的任何或所有候选键,而不仅仅是一个。通常每个表都有一个键用于此目的,但不一定要如此。
      【解决方案5】:

      可以在一个表中有多个候选键,但按照惯例,每个表只有一个键称为“主键”。这只是一个约定,它对按键的功能没有任何真正的影响。主键与任何其他候选键没有什么不同。如果您发现将多个键称为“主要”很方便,那么我建议您这样做。在我看来(我不是唯一一个)指定“主”键的想法本质上是一个过时的概念,在数据库设计中几乎没有什么重要性。

      您可能有兴趣知道有关关系数据库模型的早期论文(例如,由关系模型的发明者 EFCodd 撰写)实际上使用术语“主键”来描述关系,而不仅仅是一个。因此,每个表有多个主键是一个很好的先例。精确指定一个主键的想法是最近才出现的,并且可能随着 ER 建模技术的普及而普遍使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-24
        • 1970-01-01
        • 2020-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-21
        • 1970-01-01
        相关资源
        最近更新 更多