【问题标题】:Why can a database table have only one primary key?为什么一张数据库表只能有一个主键?
【发布时间】:2015-07-17 12:30:05
【问题描述】:

一个数据库表只能有一个主键,不能有两个或更多......为什么会这样?

【问题讨论】:

  • OP 是在问为什么会这样,而不是他/她是否能做到。
  • 你知道“初级”是什么意思吗?
  • 这是一个公平的问题 Pankaj
  • 如果您想要回答“为什么”而不仅仅是“因为”,请参阅我的回答。 (答案是,这是不必要的传统。)

标签: mysql sql database oracle


【解决方案1】:

主要原因是因为那是主键的定义。一个表可以有多个唯一键来标识每一行,但只有一个主键。

在 MySQL 等数据库中,主键也是聚集索引。这提供了一个更直接的原因。根据聚集索引在页面上对数据进行排序。一个表只能有一个排序顺序。

【讨论】:

  • 说得很好。表的物理布局中的主顺序是我认为只有一个主键的主要原因。
  • @luksch 。 . .但是,并非所有数据库都如此。 SQL Server 允许在非主键上使用聚集索引。
  • 请回复您的第一句话:这不是原因,这只是对事实的两次重述。 (事实上​​,没有必要因此没有理由。)关于您的第二条陈述:由于主键并不总是聚集索引,显然这不是必须拥有主键的原因。 (即使拥有聚集索引需要主键,当然它们不是。)(“好”、“很好”和接受的答案?!)
  • @philipxy 这解释了为什么只有一个主键,你只需要深入研究。主键为表行提供唯一标识符,该标识符基本映射到 btree 以获取 log(n) 访问时间。我想这就是为什么大多数磁盘数据库会为每个实体生成一个 uid 的原因,但我们不应该局限于一个,绝对可以在设计新数据库时选择两列或更多列作为主键,但为什么要这样做呢?它占用更多磁盘空间并减慢整个数据访问时间。
  • @tyan 查看我的回答。并重读我的评论。包括“显然这不是必须拥有主键的原因”。
【解决方案2】:

(关系)表的“超级键”是一组列,其中每一行都有一个在表中唯一的子行。 (请注意,超键的每个超集也是超键。)(朴素的 SQL KEY 声明的内容,以及它们的超集。)不包含更小的超键的超键是“候选键”。规范化和其他关系理论关心候选键而不关心主键。就查询、更新和约束的含义而言,没有必要或没有基础来选择一个候选键并将其称为“主键”(而其他键称为“备用键”)。这只是关系模型早期从前关系系统继承下来的传统,当时人们认为它没有必要。

对于索引的目的也没有必要(这与性能有关,另一个重要的可观察表达式)。

然后,因为有主键的传统,其他东西(如自动索引)都附加到它们上。但是那些东西不需要附加到主键上,主键对于那些其他的东西也不是必需的。

SQL 只允许您声明一个PRIMARY KEY,因为“假定”只有一个主键,但这并不意味着有充分的理由声明附加功能之外的任何内容。无论如何,SQLPRIMARY KEY 实际上意味着UNIQUE NOT NULL,即超级键,而不是候选键,所以只有在PRIMARY KEY 的列的适当子集上没有声明UNIQUE NOT NULL 时,它才声明主键。因此,SQL PRIMARY KEYs 不一定是主键这一事实表明,声称对主键的需求是多么空洞。 (并且 SQL FOREIGN KEYs 不是外键,因为它们不引用任何但只有候选键(应该如此),甚至任何但只有主键,甚至任何但只有 PRIMARY KEYs,它们引用任何但只有超级键。因此,这种关于主键必要性的声明是空的。)

大多数 SQL DBMS 会自动特别索引 PRIMARY KEYs。但这只是向用户展示某些实现方式的某种方式。

有时声称使用单一方式引用核心业务实体证明使用基表主键是合理的。然而,任何表表达式的任何超键,即任何候选键的任何超集,都标识了任何包含的超键所做的一切(包括主键)。因此,即使实体的主键列不存在,查询仍然可以具有标识它的列。此外,任何表表达式的任何超键都标识了某个实体,无论它是否在某个基表中标识(更不用说通过主键了)。此外,即使列被查询投影/SELECTed 删除,其行的含义仍然取决于包含这些列的表的含义。因此,查询、更新或约束也可能涉及核心业务实体,但其指定的主键列不存在。它可以涉及没有关联的基本主键列的派生实体。因此,声称主键是唯一标识或唯一标识所必需或基本的说法是没有根据的。

【讨论】:

  • 你是对的!,我现在在某个时候同意你的观点,我越想越觉得这就像早期设计师试图在数据集上索引数据造成的错误。而且这个主键概念应该扔掉!
  • @tyan 您可能还对Does an empty SQL table have a superkey? Does every SQL table?"1NF" has no single meaning. ...或我的许多关系模型答案感兴趣。
  • 大多数人甚至都不会考虑这些,他们只是接受教科书误导他们的任何东西。为他们感到难过。
  • @tyan 遗憾的是,仅仅接受模糊的事物而不注意到它们并不清晰似乎是很人性化的。我最喜欢的数据库报价之一是"It all makes sense if you squint a little and don’t think too hard."
  • 阅读所有链接,这需要一些时间来消化,我不得不承认它背后的理论是相当有说服力的,即使我跳过了长证明的一部分,它真的让我大开眼界,节省了大量时间.欣赏它。
【解决方案3】:

在关系数据库模型中,主键是保证唯一访问的标识属性。当您为表指定主键时,数据库引擎会通过为主键列创建唯一索引来强制数据唯一。

MS Technet 中的进一步阅读: https://technet.microsoft.com/en-us/library/ms191236(v=sql.105).aspx

【讨论】:

    【解决方案4】:

    使用单个唯一值标识特定行/元组。

    【讨论】:

      【解决方案5】:

      我知道这里已经关门了,但是...

      ALTER TABLE 表名添加 约束 pk_name 主键(C1、C2、C3)

      你可以用一、二、三....组合进行PK。

      【讨论】:

        【解决方案6】:

        因为主键用于确定表中的唯一行。

        这意味着给定行中的所有其他列都应该依赖于主键列。如果一个表有多个主键,则意味着主键字段能够与表中的其余字段一起确定彼此,这反过来又意味着数据存储方式和架构设计存在问题数据库。

        【讨论】:

          猜你喜欢
          • 2011-03-14
          • 2019-07-17
          • 1970-01-01
          • 2011-04-17
          • 1970-01-01
          • 1970-01-01
          • 2020-02-24
          • 2012-11-14
          相关资源
          最近更新 更多