【问题标题】:Oracle multiple inserts, different idsoracle多次插入,不同的id
【发布时间】:2010-12-03 09:11:48
【问题描述】:

我想将一些数据从一个表移动到另一个表。我写了一个我认为可行的查询,但是在目标表中,有一列包含一个 id。我希望我插入的每一行都具有不同且连续的 id。这是一个简化的例子:

Table1
Name Telephone Actie
Peter 123456 Y
Michael 111111 Y
George 1234445 N

Table2
Id Name Likes
1 Peter Books
2 Michael Books

我写的查询:

insert all into table2 (name, likes)
select all.name name, 'Books' likes, from (select o.name
  from table1 o where o.active='Y') all;

有没有办法生成连续的 id 并使用“全部插入”查询?一个序列?如果它可以用序列制作......有没有什么方法可以不用序列?

感谢和问候!

【问题讨论】:

    标签: oracle insert


    【解决方案1】:

    在 Oracle 中生成 id 的正确方法是使用序列。

    create sequence seq_table2_id nocache;
    

    然后在插入调用 seq_table2_id.nextval.

    insert into table2 (id, name, likes)
    select seq_table2_id.nextval
    ,      o.name
    ,      'Books'
    from   table1 o
    where  o.active = 'Y'
    

    我个人使用触发器在插入时自动调用序列,但也有人不喜欢使用触发器。

    【讨论】:

    • 答案很好,但我希望不使用任何序列就可以做到这一点,即使知道这是最佳解决方案。
    • 没有理由为一次性的单会话插入创建序列。在这种情况下,ROWNUM 是完全“合适的”。
    【解决方案2】:

    您可以使用 ROWNUM:

    insert into table2 (id, name, likes)
    select ROWNUM, all.name name, 'Books' likes from (select o.name
      from table1 o where o.active='Y') all;
    

    我不确定你为什么有子查询(也许你的真实查询更复杂?)你可以写:

    insert into table2 (id, name, likes)
    select ROWNUM, o.name, 'Books' likes 
      from table1 o where o.active='Y';
    

    【讨论】:

    • 是的,正如你所说,我的查询确实更复杂......也许我举的例子不是最好的。我使用 ROWNUM 重写了我的查询,它就像我想要的那样工作!谢谢你的回答。
    猜你喜欢
    • 2013-01-03
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多