合并导致违反唯一约束

问题描述:

MERGE INTO dpr d 
USING (select 3333 dpr_qot_id, to_date('1-Jun-07', 'DD-MON-RR') dpr_ts 
from dual) s 
on (s.dpr_ts = d.dpr_ts and s.dpr_qot_id = d.dpr_qot_id) 
when not matched then 
insert 
(DPR_TS, 
DPR_OPEN, 
DPR_HIGH, 
DPR_LOW, 
DPR_CLOSE, 
DPR_VOLUME, 
DPR_QOT_ID) 
values 
(to_date('1-Jun-07', 'DD-MON-RR'), 
920, 
941.5, 
915, 
933.5, 
696218, 
3333) 
WHEN MATCHED THEN 
UPDATE 
set DPR_OPEN = 920, 
DPR_HIGH = 941.5, 
DPR_LOW = 915, 
DPR_CLOSE = 933.5, 
DPR_VOLUME = 696218; 

我有一个类似查询(不同日期,价格)的循环。无论如何,有时我得到错误:违反唯一约束(QF.IDX_DPR_ID)(DBD错误:OCIStmtExecute)。 在DPR_ID上定义了由触发器生成的唯一约束。 任何线索我该如何解决这个问题?循环是用perl编写的。我期望,这种错误不会在使用合并时出现,不知道我在做什么错误。 我可以在pl/sql中执行它。该错误在循环中仅出现'唯一'。它是否有时间问题?合并导致违反唯一约束

在此先感谢 问候 玛格达

+0

请显示触发器用于创建DPR_ID – tbone 2011-03-31 11:24:08

我首先想到的会比DPR_ID表中的最高值低,也许序列正在返回值。运行这些查询看:

1) select last_number from user_sequences 
    where sequence_name = '<name of sequence>'; 

2) select max(dpr_id) from dpr 

如果从查询1的结果比从查询2的结果低,则序列是失步与表中的,需要加以修正。

+0

您好托尼,感谢您的回复。 – 2011-03-31 13:06:51

+0

事实上,它是由于序列返回的错误(而非唯一)号码。非常感谢你!! – 2011-03-31 13:34:46

+1

没关系。如果你对此感到满意,你可以“接受”我的答案。 – 2011-03-31 13:38:39