在sqllite中更新多行会导致唯一约束异常

时间:2019-04-05 15:15:19

标签: sql sqlite

我有一个表,其中有一个列,我想对其施加唯一约束。 然后,我想执行一个查询来更新该列的值,并且最终结果不应违反唯一约束。这在mssql中可以完美运行,但是sqllite光荣地失败了此任务,抛出了唯一的约束异常

这是一个例子

Create table page (
    id BLOB NOT NULL CONSTRAINT "PK_Page" PRIMARY KEY,
    Name nvarchar(200),
    ParentId BLOB NOT NULL,
    Placement int
);

CREATE UNIQUE INDEX "IX_Page_ParentId_Placement" ON "Page" ("ParentId", "Placement");

insert into page (id,name,parentid,placement) values ('id1','A','r',1);
insert into page (id,name,parentid,placement) values ('id2','A','r',2);
insert into page (id,name,parentid,placement) values ('id3','A','r',3);
insert into page (id,name,parentid,placement) values ('id4','A','r',4);


update page set placement = placement + 1;

https://www.db-fiddle.com/f/rSz1iU1jkcDBdahqJNqGat/0

反转插入语句的顺序是可行的,但在生产环境中则行不通。

有解决方案吗?

1 个答案:

答案 0 :(得分:1)

一种方法是使用两次更新:

update page
    set placement = - (placement + 1);

update page
    set placement = - (placement + 1);