给出的是一个简单的数据库表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 并未实现延迟约束。
最佳答案
您可以使用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);
如果所有数字均为正数,您可以先将所有数字更改为负数,然后更新每个值。
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;
关于sql - 在 H2 数据库中交换具有唯一约束的列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34315056/