SQL:唯一性约束和循环行

时间:2017-06-02 20:30:37

标签: sql transactions unique-constraint

我正在编写一个库(在ORM的帮助下)将允许人们存储包含position列的行,并在以后将行从一个位置移动到另一个位置。因此,我们的想法是允许用户重新订购存储的数据。

在一个简单的实现中,只需将它设为一个整数列,并执行两个UPDATE语句就足够了:一个将所需的行从旧位置移动到新位置,第二个移动所有行。 - 在一个位置上/下(取决于移动方向)。 但是,当这些查询对中的多个同时发生时,即使它们包含在TRANSACTION中,也会出错,因为大多数情况下事务隔离级别未设置为“Serializeable”,因此在这些情况下,两行最终会有相同的position值。

解决这个问题的想法是使用UNIQUE CONSTRAINT,但这意味着我们需要在单个UPDATE查询中执行上述两个步骤。这是可能的,使用模运算(类似position = (((position - beginning) + 1) % length + beginning))。

然而,事实证明Postgres,MySQL和SQLite都无法弄清楚在UPDATE语句之后约束仍然存在。相反,(为了提高效率或简化实现原因?),只要您尝试将第一行增加到已存在的位置,它们就会报告错误。

有人向我提到的一个“解决方案”是将约束改为DEFERRED,这意味着它只会在交易结束时进行检查。但是,我不认为这在SQL数据库中得到广泛支持(我更喜欢让库以数据库无关的方式工作)。

是否还有其他选项可以确保此问题的数据库完整性?

0 个答案:

没有答案