【问题标题】:UPDATE before INSERT (Oracle)插入前更新 (Oracle)
【发布时间】:2009-10-27 18:18:00
【问题描述】:

我有两个具有相同表结构的模式 S1 和 S2。我将从示例开始:

在 S1.table1 我有:

ID 数据1 数据2 ---- ---------- ---------- 01 数据1 测试1 02 数据1 测试1

在 S2.table1 我有:

ID 数据1 数据2 ---- ---------- ---------- 01 数据2 测试2 02 数据2 测试2

是否可以选择一行(从 S1.table1)更新它(更改 ID 列的值)并将其插入到 S2.table1 中?我想编写单个 SQL 查询,它将是用作准备好的语句 (Java)。

S2 的最终结果应该是:

ID 数据1 数据2 ---- ---------- ---------- 01 数据2 测试2 02 数据2 测试2 03 数据1 测试1

所以我从 S1.table1 中插入了第一行,并且只更改了 ID。

谢谢, 乔纳斯

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    怎么样

    INSERT INTO S2
    SELECT 03, DATA1, DATA2 FROM S1 WHERE ID=01
    

    也就是说,您只需选择您想要的数据,但明确指出任何替换数据。

    【讨论】:

    • 谢谢,好主意。但是,如果我不想列出所有其他列怎么办?就像:INSERT INTO S2.table1 (SELECT * FROM S1 Where ID = 01) 但我想修改 ID 列(它不是自动生成的)
    • 是的,这很难。我也有过想要一个 SELECT EVERYTHING EXCEPT 命令的情况,但是没有。我想你可以简单地复制整行,然后立即进行更新。
    【解决方案2】:
    INSERT INTO S2 (Data1, Data2) SELECT Data1, Data2 FROM S1 WHERE ID=xxx
    

    假设 S2 中的 ID 是自动递增的(例如通过序列和触发器)。

    【讨论】:

    • 使用 [sequence name].NEXTVAL - 通常不需要在触发器中执行此操作。
    • 是的,但触发器的优点是不需要您使用正确的序列。我想这是一个品味问题。
    • ID列不是自动递增的,我用了非常简化的例子,表实际上包含大约50列,键列(约束唯一)不是自动生成的值。
    • @Lucero:“不需要使用正确的序列”?原生工具和隔离级别并不能真正证明它是一个品味问题......
    【解决方案3】:

    你必须使用一个序列:

    insert into s2.table1
    select seq.next_val, data1, data2
    from s1.table1
    

    序列将始终递增。因此,当您再次运行时,新行将“附加”到现有行。

    【讨论】:

      【解决方案4】:
      insert into s2.table1 (
        select id+1, data1, data2 
        from s1.table1 
        where id=(select max(id) from s1.table1)
      );
      

      【讨论】:

        猜你喜欢
        • 2014-06-22
        • 2013-07-01
        • 2017-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-19
        • 2012-02-12
        • 2017-05-31
        相关资源
        最近更新 更多