【发布时间】:2014-06-08 01:29:43
【问题描述】:
我有一个列位置的表,它具有唯一且非空约束。
我已经向上/向下移动了选定的表项要求,
为此,我采用选定的索引并交换索引。
并将这两项保存在 DB 中。
每当我尝试插入第一个项目本身时,它都会给予 UNIQUE 约束..
因为该项目的索引已经存在于 DB 中。
有可能我可以采取临时索引,交换...并保存..我认为它有效。
但是有没有其他方法可以达到这个要求
【问题讨论】:
我有一个列位置的表,它具有唯一且非空约束。
我已经向上/向下移动了选定的表项要求,
为此,我采用选定的索引并交换索引。
并将这两项保存在 DB 中。
每当我尝试插入第一个项目本身时,它都会给予 UNIQUE 约束..
因为该项目的索引已经存在于 DB 中。
有可能我可以采取临时索引,交换...并保存..我认为它有效。
但是有没有其他方法可以达到这个要求
【问题讨论】:
最简单的方法是像你说的那样使用一个临时值,因为约束不会让你在任何时候都有两行具有相同的值。
您可以通过基于原始值并查看您通常无法拥有的数据类型来推导出一个本身唯一的临时值。例如,负数可能会起作用。
除此之外,您可以将约束声明为延迟。然后直到您的交易结束才会强制执行。但这可能有点过于努力/影响。
如果有问题的字段真的只用于排序(而不是对象标识),您可以考虑完全放弃唯一性。如有必要,您可以使用唯一的主键作为决胜局。
【讨论】:
如果您在一个 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);
【讨论】: