按顺序重新排列唯一键列值

时间:2016-04-19 11:06:32

标签: c# oracle

在数据库中,我们有一个像

这样的表

enter image description here

此处序列是唯一键,它基本上显示UI中行的位置。现在我需要通过将C2序列更改为1并将C1序列更改为2来将C2的位置更改为C1。同样,我可以重新排列序列,并且我能够重新排列内存中列表的序列。

正如我之前所说,序列是数据库中的唯一键(我使用的是oracle数据库)所以当我尝试提交批量更新查询时,它显示唯一键约束错误。我在下面列出了一些解决方案。

解决方案1 ​​

禁用唯一键约束并更新序列,然后为表启用唯一键。

解决方案2:

  1. 将C2的序列更新为最大(序列)+1。
  2. 将C1序列更新为2
  3. 将C2序列更新为1.这样我们就可以避免唯一的密钥冲突。
  4. 示例:

    我们必须将C2移至C1位置,以便我们更新

    1. C2 =>最大(序列)+1 => 5 + 1 => 6
    2. C1 => 2
    3. C2 =大于1
    4. 解决方案3

      1. 将C2的序列更新为-1

      2. 将C1的序列更新为-2

      3. 休息所有序列也应修改为C2到-3

      4. C4 o -4

      5. 然后提交更改并再次将所有序列更新为(序列)*( - 1) 再次提交更改。

        解决方案4

        我们也可以从数据库中删除这两行,然后使用重新排列的序列再次添加它。

        这是我所拥有的四种解决方案,但这三种解决方案都不适合性能预期。请建议我解决这个问题的最有效方法。我正在使用C#和oracle

1 个答案:

答案 0 :(得分:0)

我认为更新现有行的唯一键值是错误的方法。反之亦然,并更新其余列。 e.g。

merge into yourtab f
using (-- exchange values of seq 1 and 2
       select 1 seq, 'C2' code, '1.2' name
         from dual
       union all
       select 2, 'C1', '1.1'
         from dual) src
on (f.seq = src.seq)
when matched then
  update set code = src.code, name = src.name;

btw我不明白为什么你需要更新seq以重新排序UI中的列表,为什么不简单地按order by子句重新排序?