更新然后插入甲骨文



嗨,我想进行更新,然后在 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

假设我想将杰克从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 行因此

并在一个声明中完成。可能吗?

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

我假设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。
但是,如果您必须使用单个命令,那么您必须忍受它。

最新更新