Sql 每个表都应该有主键吗?

Sql 每个表都应该有主键吗?,sql,database,Sql,Database,我在某个地方读到,每个表都应该有一个主键来完成1NF 我有一张友谊桌 表中有两个字段:所有者和朋友 Owner和Friends字段是tbl_user中自动递增id字段的外键 这种tbl_友谊应该有主键吗? 我应该在tbl_Friendly中创建一个自动递增id字段并将其作为主键吗 如果表具有主键,那么从长远来看,它将更易于管理。至少,您需要唯一地标识表中的每条记录。用于唯一标识每条记录的字段也可以是主键。主键可以应用于多个列!在您的示例中,主键应该位于两列上,例如(所有者、朋友)。尤其是当Own

我在某个地方读到,每个表都应该有一个主键来完成1NF

我有一张友谊桌

表中有两个字段:所有者和朋友

Owner和Friends字段是tbl_user中自动递增id字段的外键

这种tbl_友谊应该有主键吗?
我应该在tbl_Friendly中创建一个自动递增id字段并将其作为主键吗

如果表具有主键,那么从长远来看,它将更易于管理。至少,您需要唯一地标识表中的每条记录。用于唯一标识每条记录的字段也可以是主键。

主键可以应用于多个列!在您的示例中,主键应该位于两列上,例如(所有者、朋友)。尤其是当Owner和Friend是users表的外键而不是实际名称时,比如说(就个人而言,我的标识列使用“Id”命名约定,因此我会使用(OwnerId,FriendId)

我个人认为每个表都应该有一个主键,但你会发现其他人不同意

这是我写的一篇关于范式的文章。

是每个表都应该有一个主键

是的,您应该创建代理密钥..也称为自动递增pk字段

您还应该将“Friend”设置为该自动递增字段的FK


如果你认为你要“重新开始”将来,您可能希望研究使用自然键,这是自然识别数据的字段。关键是在编码时始终使用自然标识符,然后在这些自然键上创建唯一索引。将来,如果您必须重新设置键,您可以这样做,因为您的用户体验保证了数据的一致性


只有在您必须这样做的情况下,我才会这样做,因为这会增加代码和数据模型的复杂性。

从您的描述中不清楚,但它们是所有者和朋友外键,并且任何给定对之间只能有一种关系?这使得两个外键列成为自然主键的完美候选


另一种选择是使用代理键(您建议的额外自动递增列)。请查看深入讨论。

主键也可以是抽象的内容。在这种情况下,每个元组(所有者、朋友),例如(“Dave”、“Matt”)可以形成唯一的项,因此可以作为主键。在这种情况下,不使用名称,而是使用引用另一个表的键是很有用的。如果您保证这些元组不能有重复项,则可以使用有效的主键

出于处理的原因,引入一个特殊的主键可能会很有用,比如自动递增字段(例如在MySQL中)或使用Oracle的序列。

以符合1NF(这并不完全符合1NF的定义),是的,您应该在每个表上标识一个主键。这对于提供每个记录的唯一性是必要的


一般来说,您可以通过多种方式创建主键,其中一种方式是拥有一个自动递增列,另一种方式是拥有一个带有GUID的列,另一种方式是拥有两个或更多列,当组合在一起时,它们将唯一地标识一行。

是每个表都应该拥有(至少一个)键。由于许多原因,不希望在任何表中复制行,因此对这两列进行约束。

i尽管主键必须具有唯一值?所有者和朋友的字段将有许多重复值。通常,我会将所有者和朋友的字段设置为索引(不是主键).我是对的还是错的?是的,唯一性是主键的一个属性。在一个表中有完全相同的行是不常见的,但是如果这是一个要求,那么你可以选择不使用主键,或者像你建议的那样添加自动递增列。-1,永远不要对主键使用非技术性列,那将是通往地狱的路使用像OP建议的“ID”这样的技术主键。@Doc Brown,什么是“非技术列”?嘿,Doc,永远不要说“永不”。但在这种情况下你是对的。我也不会将pks放在实际值上。但是,对于关系表,我喜欢使用由外键(OwnerId,FriendId)组成的复合主键-1,永远不要使用非技术性的列作为主键,那将是通往地狱的道路!相反,使用像“ID”这样的技术性主键,就像OP建议的那样。@Tamasz Nurkiewicz,我已经更新了我的问题来澄清。谢谢。我可以知道如何将两个外键作为主键吗?我的意思是如何将它们设置为主键?@zac1987:相信我,你不想遵循这个建议。例如,想想如果你试图更改所有者的内容会遇到什么问题或者朋友的现有记录。@Doc Brown,我想不出任何理由更改tbl_用户的自动增量id…如果用户删除朋友,只需从tbl_Friends中删除一组主键(两个外键)。您的“更改”意思是删除?我想不会有问题。我可以知道“Friend”的外键吗必须参考tbl_用户或tbl_Friendly的自动增量id字段?如果tbl_Friendly,为什么?我认为您将“主键”与“人工标识符”或可能的“代理键”混淆了。谷歌搜索Chris Date在YES上的文字!-如果没有主键,它就不是表(Joe Celko)