使用唯一的非空约束在表中交换两行

时间:2014-04-23 09:40:23

标签: sql oracle jpa

我有一个包含列位置的表,它具有唯一且非空约束。

我向上/向下移动选定的表项目要求,

为此我正在选择所选索引并交换索引。

并保存这两个项目,如DB。

每当我尝试插入第一个项目时,它会给出UNIQUE约束。

因为项目索引已存在于DB中。

我有可能采取临时索引,交换......并保存..我认为它有效。

但是有没有其他方法可以达到这个要求

2 个答案:

答案 0 :(得分:1)

如果您在一个Update语句中进行更新,它将正常工作。

create table t (id number primary key);

insert into t values (1);
insert into t values (2);

commit;

update t set id = case when id = 1 then 2 else 1 end
where id in (1,2);

答案 1 :(得分:0)

最简单的方法是使用像你说的临时值,因为约束不会让你随时拥有两行具有相同值。

您可以通过将其基于原始值并查看通常不具有的数据类型来获取本身唯一的临时值。例如,负数可能有用。

除此之外,您可以将约束声明为延迟。然后,在您的交易结束之前不会强制执行。但这可能有点太多的努力/影响。

如果有问题的字段实际上仅用于排序(而不是用于对象标识),则可以考虑完全删除唯一性。如有必要,您可以使用唯一的主键作为平局。