您好我想做更新,然后在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
添加了第五行,并更新了第一行。 实际的表有更多的列。
所以我的目标是
并在一份声明中完成。有可能吗?
它将在一个事务中,在该方法上注释@Transactional。要求一个陈述或一定数量的陈述的原因是为了避免N + 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_sequence
为ID
列生成新值。
我个人会在一个事务中做简单的INSERT
和UPDATE
(作为单独的命令),然后在最后提交整个事务,而不是使用这个可怕的MERGE。
但是如果你必须使用一个命令,那么你必须忍受它。