sql - 对除主键之外的所有列定义 UNIQUE 约束是一个好主意吗?

标签 sql hash relational-database

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

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

最佳答案

唯一约束是使用唯一索引(我所知道的所有数据库中的 B 树索引)来实现的。

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

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

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

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

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

关于sql - 对除主键之外的所有列定义 UNIQUE 约束是一个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65980064/

相关文章:

sql - 从另一个没有数据的表的结构创建表

SQL - 如何将列及其数据复制到同一个表中的新列?

javascript - Redux.js 和数据有关系

php - 一次更新多对多连接器表

sql - oracle sql中填写序号

sql - 你如何找出MySQL数据库中数据的总大小?

c++ - 通过 UDP 将信息哈希发送到 Bittorrent Tracker

arrays - 从以数组为值的散列中获取数组

Python脚本,没有输出?

database-design - 如何在关系数据库中对多语言实体建模