主键本身是否包含重复项但具有唯一行?

时间:2014-03-25 12:43:12

标签: mysql sql

例如,请使用 ACCOUNT 表:

|num |   type  |amount|
|----------------------
| 1  |  cheque | 300  |
| 2  |  cheque | 300  |
| 2  | savings | 300  |

即使 [check,300] 出现两次,主键也会 [type,amount] 吗?

我很困惑,因为即使检查300是重复的, num 列对于两个重复项也是不同的,这意味着它仍然是唯一行的一部分。

3 个答案:

答案 0 :(得分:1)

如果num是主键,则它不能包含重复项或NULL值。 "主键"意味着没有重复。

可以想象您可以拥有一个由(id, type)组成的复合主键。在特定id可能同时具有与其关联的支票和储蓄帐户的应用程序中,这可能是有意义的。

然后,由于主键约束,尝试插入值为2 | savings的另一行将失败。

答案 1 :(得分:1)

正如您所指出的,num在两行之间是不同的。这意味着numtype可以制作复合主键,或者您甚至可以使用numtypeamount(尽管如果这三列构成你的整个表,这将是毫无意义的。)

但由于typeamount有重复的数据,因此它们不能成为您的主键。如果num没有包含在密钥中,则num具有唯一数据并不重要。它是主键中必须唯一的列,而不是整行的数据。

您说您感到困惑,因为当您加入num时,该行仍然是唯一的。但是,如果num未包含在您的索引中,那并不重要。主键是一个索引,旨在帮助数据库引擎快速定位和查找表中的每一行。它通过仅存储要用于这些查找的一小部分数据来提高性能。如果它可以考虑表格中的每一列 - 例如您的示例中的{{1}} - 它就没有任何意义。数据库引擎只是扫描整个表而不是执行查找。

答案 2 :(得分:1)

不,[type,amount]不能是主键,因为它不是唯一的。

在数据库中使用主键有两种方法:

  1. 使用技术ID。您只需在表中添加一个ID列,并且只能通过这些链接。
  2. 使用自然键。例如,这将是书籍表的ISBN或员工表中的员工编号。在这里你提出一个问题:“这张表中的记录是什么?”。在你的表中,这可能是[num,type]。