在H2数据库中使用唯一约束交换列值

时间:2015-12-16 14:48:54

标签: sql constraints h2

给定的是一个简单的数据库表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未实现延迟约束

1 个答案:

答案 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