SQL:当列是唯一且连续的时,将1(或N)添加到每行的给定列中?

时间:2014-07-24 01:46:40

标签: sql sqlite unique-constraint

我有一个带有表的sqlite数据库,我们称之为books。该表有一个名为ordering的列,它是一个UNIQUE整数列,用作ORDER BY子句的默认列。

当用户想要更改排序时,我的软件会向他们展示一个拖放界面,最终导致在另外两行之间插入一个给定的行(暂时忽略最终用例),并更新所有后续行

我的第一步是在我要插入它之后递增所有行,因此新项目的序列中有空格。 SQL看起来像这样:

UPDATE menuitem SET ordering=ordering+1 WHERE ordering >= 3; # ordering=3 is where I want to insert the item

我收到以下错误:Error: column ordering is not unique

我想这是因为它试图逐个更新行,并且它无法处理当前一行等于后续行时会有一瞬间的事实。我对此感到惊讶,因为我认为这将是一个原子操作,一旦查询完成,它只关心约束。

无论如何,假设这是问题,我已经尝试(预感)以相反的顺序运行更新,因此它首先更新最高的数字,并且不存在临时冲突。这对我来说似乎很脆弱,但无论如何我都没有运气:

sqlite> UPDATE menuitem SET ordering=ordering+1 WHERE ordering >= 3 ORDER BY ordering DESC;
Error: ORDER BY without LIMIT on UPDATE

sqlite> UPDATE menuitem SET ordering=ordering+1 WHERE ordering >= 3 ORDER BY ordering DESC LIMIT -1;
Error: column ordering is not unique

sqlite> UPDATE menuitem SET ordering=ordering+1 WHERE ordering >= 3 ORDER BY ordering LIMIT -1;
Error: column ordering is not unique

是什么给出的?我是否必须删除唯一约束?还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

您可以通过两次更新来完成此操作。这是一个例子:

update menuitem
    set ordering = -ordering
    where ordering >= 3; # ordering=3 is where I want to insert the item

insert new item here

update menuitem
    set ordering = (-ordering) + 1
    where ordering < 0;