Oracle数据库 merge into出现了重复数据插入的情况

嘿嘿巴扎嘿 2020-07-28 09:19:29
现在出现了一个很灵异的情况....在数据库中使用这条SQL语句, 无论执行多少次都不会出现重复数据, 但是在实际的项目中, 循环读取数据,执行SQL, 进行插入或者是更新时, 会出现一模一样的重复数据, 声明下,建表的SQL没有加任何约束,可以重新建表,加个主键约束等, 很蓝瘦~ 求助下这是什么问题, 需要加什么约束吗?





merge into AA_Temp_gj t1 using dual on(
(select count(*) from AA_Temp_gj h where h.ID=101)>0)

when matched then
update set ID=101,dcreatesystime=to_date('2020-06-23 16:36:11', 'yyyy-mm-dd hh24:mi:ss'), cOperator='0222', cCheckMan='0222', iAmount_f=200000.0000,
dverifydate=to_date('2020-06-23 00:00:00', 'yyyy-mm-dd hh24:mi:ss'), iAmount=200000.0000, cDeptCode='01',cPerson='0102', cCusVen='230007', cSSCode='7', cBankAccount='0406000200035158',
dVouchDate=to_date('2020-06-23 00:00:00', 'yyyy-mm-dd hh24:mi:ss'), cDigest='测试数据', cDepCode='null', cPersonCode=2010731, iAmt=200000.0000, iAmt_f=200000.0000, cBank='null',
cNatBankAccount='12345678901234567', cOrderID='null', cNoteNo='null',cVouchID='0000109' where id=101

when not matched then
insert(ID,dcreatesystime,cOperator,cCheckMan,iAmount_f,dverifydate,iAmount,cDeptCode,cPerson,cCusVen,cSSCode,cBankAccount,dVouchDate,cDigest,cDepCode,cPersonCode,iAmt,
iAmt_f,cBank,cNatBankAccount,cOrderID,cNoteNo,cVouchID) values(101,to_date('2020-06-23 16:36:11', 'yyyy-mm-dd hh24:mi:ss'),'0222','0222',200000.0000,
to_date('2020-06-23 00:00:00', 'yyyy-mm-dd hh24:mi:ss'),200000.0000,'01','0102','230007','7','0406000200035158',to_date('2020-06-23 00:00:00', 'yyyy-mm-dd hh24:mi:ss'),'测试数据',
null,2010731,200000.0000,200000.0000,'null','12345678901234567',null,null,'0000109')
...全文
1951 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
嘿嘿巴扎嘿 2020-07-31
  • 打赏
  • 举报
回复
嗯嗯,谢谢,第一次使用merge,不知道会出现重复的情况。
nayi_224 2020-07-31
  • 打赏
  • 举报
回复
merge就是会有重复的,还是要加唯一约束
嘿嘿巴扎嘿 2020-07-28
  • 打赏
  • 举报
回复
引用 3 楼 riven2011 的回复:

CREATE UNIQUE INDEX idx_aa_temp_gj_u1 ON AA_Temp_gj(ID);

MERGE INTO AA_Temp_gj t1
USING dual
ON (t1.ID = 101)
WHEN MATCHED THEN
UPDATE
SET dcreatesystime = to_date('2020-06-23 16:36:11', 'yyyy-mm-dd hh24:mi:ss')
,cOperator = '0222'
,cCheckMan = '0222'
,iAmount_f = 200000.0000
,dverifydate = to_date('2020-06-23 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
,iAmount = 200000.0000
,cDeptCode = '01'
,cPerson = '0102'
,cCusVen = '230007'
,cSSCode = '7'
,cBankAccount = '0406000200035158'
,dVouchDate = to_date('2020-06-23 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
,cDigest = '测试数据'
,cDepCode = 'null'
,cPersonCode = 2010731
,iAmt = 200000.0000
,iAmt_f = 200000.0000
,cBank = 'null'
,cNatBankAccount = '12345678901234567'
,cOrderID = 'null'
,cNoteNo = 'null'
,cVouchID = '0000109'
WHERE id = 101
WHEN NOT MATCHED THEN
INSERT
(ID
,dcreatesystime
,cOperator
,cCheckMan
,iAmount_f
,dverifydate
,iAmount
,cDeptCode
,cPerson
,cCusVen
,cSSCode
,cBankAccount
,dVouchDate
,cDigest
,cDepCode
,cPersonCode
,iAmt
,iAmt_f
,cBank
,cNatBankAccount
,cOrderID
,cNoteNo
,cVouchID)
VALUES
(101
,to_date('2020-06-23 16:36:11', 'yyyy-mm-dd hh24:mi:ss')
,'0222'
,'0222'
,200000.0000
,to_date('2020-06-23 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
,200000.0000
,'01'
,'0102'
,'230007'
,'7'
,'0406000200035158'
,to_date('2020-06-23 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
,'测试数据'
,NULL
,2010731
,200000.0000
,200000.0000
,'null'
,'12345678901234567'
,NULL
,NULL
,'0000109');
够直接,我喜欢
riven2011 2020-07-28
  • 打赏
  • 举报
回复

CREATE UNIQUE INDEX idx_aa_temp_gj_u1 ON AA_Temp_gj(ID);

MERGE INTO AA_Temp_gj t1
USING dual
ON (t1.ID = 101)
WHEN MATCHED THEN
UPDATE
SET dcreatesystime = to_date('2020-06-23 16:36:11', 'yyyy-mm-dd hh24:mi:ss')
,cOperator = '0222'
,cCheckMan = '0222'
,iAmount_f = 200000.0000
,dverifydate = to_date('2020-06-23 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
,iAmount = 200000.0000
,cDeptCode = '01'
,cPerson = '0102'
,cCusVen = '230007'
,cSSCode = '7'
,cBankAccount = '0406000200035158'
,dVouchDate = to_date('2020-06-23 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
,cDigest = '测试数据'
,cDepCode = 'null'
,cPersonCode = 2010731
,iAmt = 200000.0000
,iAmt_f = 200000.0000
,cBank = 'null'
,cNatBankAccount = '12345678901234567'
,cOrderID = 'null'
,cNoteNo = 'null'
,cVouchID = '0000109'
WHERE id = 101
WHEN NOT MATCHED THEN
INSERT
(ID
,dcreatesystime
,cOperator
,cCheckMan
,iAmount_f
,dverifydate
,iAmount
,cDeptCode
,cPerson
,cCusVen
,cSSCode
,cBankAccount
,dVouchDate
,cDigest
,cDepCode
,cPersonCode
,iAmt
,iAmt_f
,cBank
,cNatBankAccount
,cOrderID
,cNoteNo
,cVouchID)
VALUES
(101
,to_date('2020-06-23 16:36:11', 'yyyy-mm-dd hh24:mi:ss')
,'0222'
,'0222'
,200000.0000
,to_date('2020-06-23 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
,200000.0000
,'01'
,'0102'
,'230007'
,'7'
,'0406000200035158'
,to_date('2020-06-23 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
,'测试数据'
,NULL
,2010731
,200000.0000
,200000.0000
,'null'
,'12345678901234567'
,NULL
,NULL
,'0000109');
嘿嘿巴扎嘿 2020-07-28
  • 打赏
  • 举报
回复
好的,谢谢。我也是第一次用merge,确实不太会用。
lhdz_bj 2020-07-28
  • 打赏
  • 举报
回复
1、从来没见merge和dual这么用的,长见识了。
2、应该是有并发,且并发或同一会话的不同循环有相同ID值的缘故。

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧