sql - 在 H2 数据库中交换具有唯一约束的列值

标签 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 并未实现延迟约束

最佳答案

您可以使用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

关于sql - 在 H2 数据库中交换具有唯一约束的列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34315056/

相关文章:

h2 - 如何配置内存 Camunda 数据库以接受更长的字符串过程变量?

sql - 使用 proc 转置计算观察次数

高度约束发生变化时的 iOS Autolayout 问题

swift - 根据条件添加约束的奇怪行为

java - 在没有 XML 配置的情况下初始化数据库,但使用 @Configuration

scala - Karaf Unresolved JDBC 约束

mysql - varchar(limit) 是如何工作的?

c# - 在 C# 中实现可更新的记录集

sql - 有人在单元测试 SQL 存储过程方面取得过成功吗?

c# - 如何将 T 转换为类以匹配 "where T : class"约束?