然后更新然后在oracle中插入

时间:2016-06-09 17:22:33

标签: sql oracle

您好我想做更新,然后在oracle下再次插入相同的记录。

例如:

    ID NAME                 TEACHER      STATUS         CourseTaken
     1 Jack                     TA          ENROLL         1
     2 Rose                     TA          ENROLL         2
     3 William                  TB          ENROLL         2
     4 Caledon                  TB          ENROLL         2

并说我想把Jack从教师TA转换为教师TB,但同时保留记录。 所以最终会像

一样
    ID NAME                 TEACHER      STATUS         CourseTaken
     1 Jack                     TA          TRANSFERRED        1
     2 Rose                     TA          ENROLL             2
     3 William                  TB          ENROLL             2
     4 Caledon                  TB          ENROLL             2
     5 Jack                     TA          ENROLL             

添加了第五行,并更新了第一行。 实际的表有更多的列。

所以我的目标是

  1. 插入第5行作为第1行的副本
  2. 更新第1行和第5行 相应
  3. 并在一份声明中完成。有可能吗?

    它将在一个事务中,在该方法上注释@Transactional。要求一个陈述或一定数量的陈述的原因是为了避免N + 1问题和性能问题。由于多行可能会有变化。

1 个答案:

答案 0 :(得分:0)

我认为ID列是主键 如果是,请尝试:

MERGE INTO mytable m
USING (
      SELECT ID, NAME,  TEACHER, STATUS, CourseTaken, d.*
      FROM mytable
      CROSS JOIN (
         SELECT * FROM dual
         UNION ALL
         SELECT null FROM dual
      ) d
      WHERE MyTable.Name = 'Jack'
) p
ON ( p.id = m.id and DUMMY IS NOT NULL )
WHEN MATCHED THEN UPDATE SET STATUS = 'TRANSFERRED'
WHEN NOT MATCHED THEN INSERT( ID, NAME,  TEACHER, STATUS )
     VALUES ( some_sequence.nextval, p.name, p.teacher, 'ENROLL' );

我假设您使用some_sequenceID列生成新值。

我个人会在一个事务中做简单的INSERTUPDATE(作为单独的命令),然后在最后提交整个事务,而不是使用这个可怕的MERGE。
但是如果你必须使用一个命令,那么你必须忍受它。