例如,请使用 ACCOUNT 表:
|num | type |amount|
|----------------------
| 1 | cheque | 300 |
| 2 | cheque | 300 |
| 2 | savings | 300 |
即使 [check,300] 出现两次,主键也会 [type,amount] 吗?
我很困惑,因为即使检查300是重复的, num 列对于两个重复项也是不同的,这意味着它仍然是唯一行的一部分。
答案 0 :(得分:1)
如果num
是主键,则它不能包含重复项或NULL值。 "主键"意味着没有重复。
可以想象您可以拥有一个由(id, type)
组成的复合主键。在特定id
可能同时具有与其关联的支票和储蓄帐户的应用程序中,这可能是有意义的。
然后,由于主键约束,尝试插入值为2 | savings
的另一行将失败。
答案 1 :(得分:1)
正如您所指出的,num
在两行之间是不同的。这意味着num
和type
可以制作复合主键,或者您甚至可以使用num
,type
和amount
(尽管如果这三列构成你的整个表,这将是毫无意义的。)
但由于type
和amount
有重复的数据,因此它们不能成为您的主键。如果num
没有包含在密钥中,则num
具有唯一数据并不重要。它是主键中必须唯一的列,而不是整行的数据。
您说您感到困惑,因为当您加入num
时,该行仍然是唯一的。但是,如果num
未包含在您的索引中,那并不重要。主键是一个索引,旨在帮助数据库引擎快速定位和查找表中的每一行。它通过仅存储要用于这些查找的一小部分数据来提高性能。如果它可以考虑表格中的每一列 - 例如您的示例中的{{1}} - 它就没有任何意义。数据库引擎只是扫描整个表而不是执行查找。
答案 2 :(得分:1)
不,[type,amount]不能是主键,因为它不是唯一的。
在数据库中使用主键有两种方法: