oracle - 错误唯一约束和触发oracle执行期间
问题描述
我有表格,用户可以在其中添加新生婴儿的信息和他/她的姓氏。将信息添加到表中时出现以下错误
ORA-00001: unique constraint (PK) violated
ORA-06512: at trigger_name, line 21
ORA-04088: error during execution of trigger
扳机:
CREATE OR REPLACE TRIGGER "DB_NAME"."TRG_NBB"
AFTER INSERT ON baby
FOR EACH ROW
WHEN (new.status = 'A') DECLARE
v_1 tab_1.col_1%type;
v_2 tab_2.col_2%type;
v_3 tab_2.col_3%type;
v_4 tab_2.col_4%type;
v_5 tab_2.col_5%type;
v_6 date;
newmofid number;
BEGIN
select max(nvl(col_2,0))+1 into newmofid from tab_2;
SELECT distinct col_1,col_2,to_char(col,'DD-MM-YYYY') INTO v_1,v_2,v_6
from table
where tcid = :new.tcid;
SELECT col_4,col_5,col_3 into v_4,v_5,v_3
from tab_2
where col_1 = v_1
and col_2 = v_2;
INSERT INTO tab_2 (all_columns)
VALUES(variable_names);
DBMS_OUTPUT.PUT_LINE('New Born Baby successfully added to member table');
END trg_nbb;
/
ALTER TRIGGER "DB_NAME"."TRG_NBB" ENABLE;
当我执行这个 sql 查询时,需要 4 到 5 秒,并且值会很快增加
select max(nvl(col_2,0))+1 into newmofid from tab_2;
结果:
6030819791
再次执行需要 3 到 4 秒
结果:
6030819798
如何解决这个问题呢?
谢谢
解决方案
我怀疑这是MAX + 1
导致问题的原因:
select max(nvl(col_2,0))+1 into newmofid from tab_2;
这样的原则在大多数情况下是错误的并且会失败,尤其是在多用户环境中,其中两个(或多个)用户同时获取相同的MAX + 1
值,进行一些处理,并且 - 在插入时 - 其中一个成功(因为它是第一个),但其余的都失败了,因为表中已经存在这样的值。
我建议你切换到一个序列,例如
create sequence seq_baby;
然后,以你的形式,做
select seq_baby.nextval into newmofid from dual;
推荐阅读
- azure - Azure Application Insights 内存使用情况
- python - Python 字典函数的问题 - 添加和删除
- mysql - 在 userInput 存储 PROCEDURE 上显示记录
- mysql - 如何在多个文本框中显示多个记录但来自同一个数据库 vb.net
- micronaut - 如何在 Micronaut 中扩展 DelegatingAuthenticationProvider
- iframe - 使用 iframe 将 gh-pages 链接嵌入到另一个 gh-pages 链接
- android - 谷歌地图标记中的气泡动画
- android - 重新加载片段留下空白屏幕
- java - Java中的SimpleDateFormat工作不正确还是我做错了什么?查看代码示例
- c - 多次加载内核模块(snd-aloop)