给定的是一个简单的数据库表ENTITY
,在POSITION
上有唯一约束。
CREATE TABLE ENTITY (
ID INT NOT NULL,
POSITION INT NOT NULL,
PRIMARY KEY (ID)
);
CREATE UNIQUE INDEX UK_ENTITY_POSITION ON ENTITY (POSITION);
此外,给出了两个以上具有独特位置的现有实体。 例如:
INSERT INTO ENTITY (ID, POSITION) VALUES (1, 10);
INSERT INTO ENTITY (ID, POSITION) VALUES (2, 20);
INSERT INTO ENTITY (ID, POSITION) VALUES (3, 30);
由于唯一约束,不可能直接交换头寸:
UPDATE ENTITY SET POSITION = 30 WHERE ID = 1;
UPDATE ENTITY SET POSITION = 10 WHERE ID = 2;
UPDATE ENTITY SET POSITION = 20 WHERE ID = 3;
如何在H2数据库上为任意数量的具有任意位置的实体交换头寸,在一个交易中。 不应使用Temporary values或临时表。 请注意,自版本1.4.190起,H2未实现延迟约束。
答案 0 :(得分:2)
您可以使用CASE
:
UPDATE ENTITY
SET POSITION = CASE ID
WHEN 1 THEN 30
WHEN 2 THEN 10
WHEN 3 THEN 20
END
WHERE ID IN (1,2,3);
的 LiveDemo
强>
<小时/> 如果所有数字都是正数,您可以先将所有数字更改为负数,然后更新每个数值。
UPDATE ENTITY
SET POSITION = -POSITION
WHERE ID IN(1,2,3);
UPDATE ENTITY SET POSITION = 30 WHERE ID = 1;
UPDATE ENTITY SET POSITION = 10 WHERE ID = 2;
UPDATE ENTITY SET POSITION = 20 WHERE ID = 3;
的 LiveDemo 2
强>