我有一个带有表的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
是什么给出的?我是否必须删除唯一约束?还有更好的方法吗?
答案 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;