我应该有主要身份证吗?我正在索引另一个字段

时间:2009-11-04 20:16:50

标签: sql database-design primary-key data-modeling

使用sqlite我需要一个表来保存blob以存储md5哈希和4byte int。我计划索引int,但这个值不是唯一的。

我需要这张桌子的主键吗?索引非唯一值是否存在问题? (我假设没有任何问题或原因)。

5 个答案:

答案 0 :(得分:11)

就个人而言,我喜欢在所有表上都有唯一的主ID。它使查找更新/删除的唯一记录更容易。

答案 1 :(得分:3)

您将如何引用SELECT * FROM Table WHEREUPDATE ... WHERE?你确定你想要每一个吗?

答案 2 :(得分:3)

你已经有了。

SQLite会自动为每个表的每一行创建一个整数ROWID列。如果您没有声明自己的主键,这可以作为主键。

通常,声明自己的主键列是个好主意。在你提到的特定情况下,ROWID可能对你没问题。

答案 3 :(得分:2)

如果您希望拥有参照完整性,我的建议是使用主键。但是,索引非唯一值没有问题。唯一的问题是你的表现会降级一点。

答案 4 :(得分:1)

让两个相同的行以某种方式进入此表有什么后果?

当然,其中一个后果是浪费了空间。但我在这里谈论更为根本的事情。有时,数据中的重复行会给您错误的结果。例如,如果按int列(字段)分组,并列出每个组中的行数,则重复的行(记录)可能会让您失望,具体取决于您实际需要的内容。

如果基于关系,关系数据库的效果会更好。关系始终处于初始状态。声明主键的主要原因是防止表退出第一范式,因此不表示关系。