Oracle SQL-按顺序更新Oracle SQL中的ID

Oracle SQL-按顺序更新Oracle SQL中的ID,sql,oracle,Sql,Oracle,我在Oracle SQL中有一个表,它的ID是按递增顺序排列的,但是由于编辑,ID中存在一些间隙,例如,ID当前类似于 22 23 24 32 33 44 等 我想通过检查表中的每一行并更新它们来修复这些间隙,这样就没有间隙了。做这件事的最佳方法是什么?我认为以下方法在Oracle中适用: update (select t.*, row_number() over (order by id) as newid) toupdate set id = newid 上述答案早就被接受了。它不

我在Oracle SQL中有一个表,它的ID是按递增顺序排列的,但是由于编辑,ID中存在一些间隙,例如,ID当前类似于

22 23 24 32 33 44 等
我想通过检查表中的每一行并更新它们来修复这些间隙,这样就没有间隙了。做这件事的最佳方法是什么?

我认为以下方法在Oracle中适用:

update (select t.*, row_number() over (order by id) as newid) toupdate
    set id = newid
上述答案早就被接受了。它不起作用。我认为答案应该有代码可以工作,所以:

merge into t dest using
       (select t.*, row_number() over (order by id) as newid from t) src
       on (dest.rowid = src.rowid)
   when matched then update set id = newid;

我认为你应该执行这个代码

DECLARE
   CURSOR A
   IS
      SELECT ROWID DD
        FROM YOUR_TABLE;
   B   NUMBER;
BEGIN
   B := 1;
   FOR I IN A
   LOOP
      UPDATE YOUR_TABLE
         SET COLUMN_NAME = B
       WHERE ROWID = I.DD;
      B := B + 1;
   END LOOP;
END;

只需将列名替换为具有错误ID的实际列名,然后执行此操作,并查看按accuratley排序的列值。多谢您可以使用单个SQL语句执行此操作,如下所示:

create table t as
  select rownum * 2 id
  from   dual 
  connect by level <= 10;

update t set id = (
  with tab as (
    select id, rownum r 
    from   (select id from t order by id)
  ) 
  select r from tab where t.id = tab.id
);

select * from t;

        ID
----------
         1 
         2 
         3 
         4 
         5 
         6 
         7 
         8 
         9 
        10 
这将导致对其中的每一行进行完整的t扫描,因此如果t很大,则会非常慢。正如评论者所说,在做这件事之前要仔细考虑;有更好的方法解决此问题。

使用以下方法:

update mytable set id = ROWNUM;

你为什么要这么做?如果ID是主键,则不应关心间隙。ID值没有意义。因此,你的问题的答案是:最好的方法是——不要这样做——我会用“没有”的名字呼应@a_horse_,并补充说,如果你以任何方式给一个ID分配意义,其中的间隔是一个问题,那么你的模式就有一个根本性的问题。您最好为编号添加一个额外的列,而不使用ID。另外:您如何处理引用这些ID的任何行?您还需要对它们重新编号。如果您的ID号是按顺序生成的,则始终会出现空白。e、 g.序列缓存的值可能会从共享池中过时,事务可能不会提交,因为使用了序列nextval等。有间隙真的可以!如果你想在报告中使用无间隙数字等,那么只需在报告时使用rownum或row_number对其重新编号。不,你们是对的-现在ID毫无意义,我只是想将其作为强迫症的一种东西进行排序,并保持干净,以防它们在将来起作用。@Gordon..请发布完整的更新声明。我只想检查一下,因为我觉得from子句在这里丢失了。当我使用它时,我得到的错误数据操纵操作在此视图上不合法..我的查询如下:更新选择t.*,按emp\U id作为newid从employee t toupdate set emp\U id=newid@Raj_Te . . . 如果你有一个问题,那就把它当作一个问题而不是在评论中提问。当然,评论在这里更合适,因为它指出这个答案在Oracle中实际上不起作用?很奇怪它被接受了。@AlexPoole。我使用merge添加了正确的答案。@GordonLinoff它需要更多的工作:您键入了merge not merge into,并且您的select仍然没有from子句:-更改记录的主键可能会让您陷入麻烦,甚至在用作外键时几乎不可能这样做…@Uwe这正是OP想要做的,所以不能批评答案!这是迄今为止最简单的解决方案,只要不需要保留ID的顺序,为什么要这样做?