2013-04-08 144 views
1

我有一个Oracle表是这样的:如何重新排序Oracle表ID

fruit id 
-------- ----- 
apple  1 
plum  9 
pear  55 
orange 104 
.. 

id列数字是错误的。我如何更新每行重新排序的ID如下:

fruit id 
-------- ----- 
apple  1 
plum  2 
pear  3 
orange 4 

什么是最有效的方法来做到这一点?

+0

http://stackoverflow.com/questions/11296361/how-to-create-id -with-auto-increment-on-oracle – 2013-04-08 16:06:55

+0

嗨,我不想删除表并重新创建它。我只是想要一个正常的循环来重置/增加 – user648244 2013-04-08 16:07:40

+0

使程序以升序获取数据并更新每个值。或者如果它是自动增量,请参阅http://stackoverflow.com/questions/5593623/reset-pk-auto-increment-column – commit 2013-04-08 16:14:50

回答

2
update your_table 
set id = rownum 
+0

先按ID排序。如果存在一个独特的约束,并且以某种方式进一步在行的下方有一个id = 2的水果,这将会中断。 – 2013-04-08 16:14:01

+0

@JoeFrambach - 你想在哪里插入'order by'?请写下您的完整查询。 – 2013-04-08 16:25:06

+1

@JoeFrambach - 不,它不会是一个原子操作,在这个操作的最后,仍然只有一行ID 2。它将以随机(ish)顺序分配新ID,但是不清楚事项。 – 2013-04-08 16:25:25

1

如果你需要保证旧秩序,下面应该这样做:

merge into the_table 
using 
( 
    select rowid as rid, 
      row_number() over (order by id asc) as new_id 
    from the_table 
) t on (t.rid = the_table.rowid) 
when matched then 
    update set id = new_id; 
0
DECLARE 
i INTEGER :=1; 
BEGIN; 
    FOR n IN (SELECT your_primary_id FROM your_table_name ORDER BY your_primary_id); 
    LOOP; 
     UPDATE your_table_name 
      SET your_primary_id=i 
      WHERE your_primary_id = n.your_primary_id; 
     i := i + 1; 
    END LOOP; 
END; 
/