在INSERT SELECT语句期间生成增量数字列值

时间:2010-05-03 19:14:36

标签: sql oracle insert auto-increment

我需要在Oracle中将一些数据从一个表复制到另一个表,同时为新表中的数字列生成增量值。这是一次只进行一次的练习,行数很少(100)。

我对这个问题有足够的解决方案,但我很想知道是否有更优雅的方式。

我正在使用临时序列,如下所示:

CREATE SEQUENCE temp_seq
    START WITH 1;

INSERT INTO new_table (new_col, copied_col1, copied_col2)
    SELECT temp_seq.NEXTVAL, o.*
      FROM (SELECT old_col1, old_col2
              FROM old_table,
          ORDER BY old_col1) o;

DROP SEQUENCE temp_seq;

有没有创建序列或任何其他临时对象的方法? 具体来说,可以使用自包含的INSERT SELECT语句吗?

请将触发器视为非选项。

更多信息:我想控制插入新行的顺序,它与旧表中创建的顺序不一样(注意我添加了上面的ORDER BY子句)。但我仍然希望我的新顺序列从1开始。

有类似的问题,但我相信我的问题的细节是原创的。

2 个答案:

答案 0 :(得分:10)

您可以使用ROWNUM。此伪列对结果中的行进行编号:

Insert Into new_table (new_col, copied_col1, copied_col2)
    Select Rownum, old_col1, old_col2
    From old_table;

如果您希望对记录进行排序,则需要使用子查询:

Insert Into new_table (new_col, copied_col1, copied_col2)
    Select Rownum, old_col1, old_col2
    From (
        Select old_col1, old_col2
        From old_table
        Order By old_col1
    );

答案 1 :(得分:-1)

为什么不将new_col列定义为primary_key或unique并将其标记为autoincrement? 这样每个插入将获得下一个更高的“计数”。

我对oracle并不熟悉,但我敢打赌它内置了自动增量功能。