在数据库系统中,每个表都应该有一个主键吗?
例如,我有一个表table1(foreignkey1,foreignkey2,attribute)
,如this.table1
没有主键。
我应该像table1id
那样为此表定义主键吗?
答案 0 :(得分:3)
这是一个主观问题,所以我希望你不要介意我回答一些意见:)
在我所做的绝大多数表格中 - 我说95%+ - 我已经添加了一个主键,并且很高兴我做到了。这可能是我表中最关键的唯一字段(想想"社会安全号码"),或者通常只是一个自动递增的数字,它允许我在查询时快速轻松地引用字段
后一种用法是最常见的,它甚至有自己的名字:a"代理"或"合成"键。这是数据库自动生成的值,而不是从应用程序数据派生的值。如果要在表之间添加关系,则此代理键可立即用作外键。正如其他人回答的那样,这些密钥非常普遍,即使你不这样做,MySQL也喜欢添加一个密钥,所以我建议这意味着共识对于添加主密钥非常偏向。
我喜欢主键的另一个方面是,它们有助于将您的意图传达给其他人阅读您的表格模式以及您的DMBS:"这一点是我打算如何唯一地识别我的行,不要这样做。让我试着打破这个规则!"
具体回答您的问题:不,主键不是必要的。但实际上,如果您打算将数据存储在表中超过几分钟的任何时间段,我强烈建议您添加一个。
答案 1 :(得分:1)
为表格提供主键/复合主键是一种很好的做法:
有助于加入表格,
群集表需要主键。
数据库设计应具有表的主键。
在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)
不,每个表都不需要主键。表是否应具有主键是基于数据库的要求。 虽然这是允许的,但这是不好的做法,因为它允许添加重复的行进一步阻止行的唯一标识。这与拥有数据库的强调目的相矛盾。