是否需要主键?

时间:2015-12-19 14:29:18

标签: mysql sql

在数据库系统中,每个表都应该有一个主键吗?

例如,我有一个表table1(foreignkey1,foreignkey2,attribute),如this.table1没有主键。

我应该像table1id那样为此表定义主键吗?

4 个答案:

答案 0 :(得分:3)

这是一个主观问题,所以我希望你不要介意我回答一些意见:)

在我所做的绝大多数表格中 - 我说95%+ - 我已经添加了一个主键,并且很高兴我做到了。这可能是我表中最关键的唯一字段(想想"社会安全号码"),或者通常只是一个自动递增的数字,它允许我在查询时快速轻松地引用字段

后一种用法是最常见的,它甚至有自己的名字:a"代理"或"合成"键。这是数据库自动生成的值,而不是从应用程序数据派生的值。如果要在表之间添加关系,则此代理键可立即用作外键。正如其他人回答的那样,这些密钥非常普遍,即使你不这样做,MySQL也喜欢添加一个密钥,所以我建议这意味着共识对于添加主密钥非常偏向。

我喜欢主键的另一个方面是,它们有助于将您的意图传达给其他人阅读您的表格模式以及您的DMBS:"这一点是我打算如何唯一地识别我的行,不要这样做。让我试着打破这个规则!"

具体回答您的问题:不,主键是必要的。但实际上,如果您打算将数据存储在表中超过几分钟的任何时间段,我强烈建议您添加一个。

答案 1 :(得分:1)

为表格提供主键/复合主键是一种很好的做法:

  1. 有助于加入表格,

  2. 群集表需要主键。

  3. 数据库设计应具有表的主键。

    在MySQL存储引擎中,如果您没有明确指定它,则始终会创建一个PRIMARY KEY,从而创建一个您无法访问的额外列。

    您可以创建复合主键,如:

    CREATE TABLE table1(
        FK1 INT,
        FK2 INT,
        ATTRIBUTE INT,
        PRIMARY KEY (FK1, FK2)
    ) 
    

    或在table1上创建约束:

    ALTER TABLE table_name
    ADD CONSTRAINT pk_table1 PRIMARY KEY (FK1,FK2)
    

答案 2 :(得分:1)

我非常喜欢合成主键。这些是自动递增的列,用于唯一标识每一行。

这些提供的功能如下:

  • 能够查看行的插入顺序。哪个是最近插入的?
  • 能够创建与表的外键关系。你现在可能不需要,但它将来可能会有用。
  • 能够重命名“数据”列而不影响其他表。

据推测,对于您的表格,您可以在(foreignkey1, foreighkey2)上定义主键。复合主键也是合理的,但它们对于外键关系和连接来说很麻烦。并且,当存在外键关系时,它们可能会导致额外的存储,因为复合键最终会存储在多个表中。

答案 3 :(得分:1)

不,每个表都不需要主键。表是否应具有主键是基于数据库的要求。 虽然这是允许的,但这是不好的做法,因为它允许添加重复的行进一步阻止行的唯一标识。这与拥有数据库的强调目的相矛盾。

相关问题