在除主键之外的所有列上定义 UNIQUE 约束是个好主意吗?

Is it a good idea to define UNIQUE constraint over all columns except primary key?

我想要一种在插入新行之前快速检查 table 中所有列(不包括 ID)内容的唯一性的方法。涉及所有这些列的 UNIQUE 约束几乎就是我所需要的。但是,在不太了解关系数据库如何工作的情况下,我不知道定义这样的约束是否是一个好的做法(在效率等方面)。

另一种更“手动”的方法是散列一行的所有内容,将散列保存到另一列并为该列定义唯一索引。但我希望数据库可能已经内置了该功能。

唯一约束是使用唯一索引实现的,在我所知道的所有数据库中都是 b 树索引。

这样的索引实际上会使您的数据大小翻倍。这可能不是问题。它将快速准确地确定是否存在重复项。

请注意,索引比较是基于数据类型的“自然”比较。特别是,这会影响考虑排序规则的字符串。字符串末尾的空格可能会被忽略。哈希函数方法无法轻松做到这一点。

此外,索引将一致地处理 NULL 值(尽管这取决于数据库)。哈希函数需要对 NULL 个值进行特殊处理。

我会警告不要直接在浮点值上使用唯一索引。问题是两个值可能看起来相同,但实际上不同(例如,0.9999999999999 和 1)。通常,您确实需要一些阈值——这对于唯一约束和哈希都是棘手的。

根据您的描述,如果您需要的话,我会建议在所有列上使用唯一索引。这样的索引是执行您描述的操作的“内置”方式。