嗨,我想进行更新,然后在 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
添加了第五行,并更新了第一行。实际表具有更多列。
所以我的目标是
- 插入第 5 行作为第 1 行的副本
- 更新第 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_sequence
为ID
列生成新值。
就个人而言,我会在一个事务中执行简单的INSERT
和UPDATE
(作为单独的命令),然后在最后提交整个事务,而不是使用这个可怕的 MERGE。
但是,如果您必须使用单个命令,那么您必须忍受它。