gpt4 book ai didi

java - ORA 000001 违反唯一约束

转载 作者:行者123 更新时间:2023-12-01 15:17:28 26 4
gpt4 key购买 nike

我有一条插入表的插入语句,该表的主键为 dep_id 和 emp_id。我的java程序为新记录生成一个新的emp_id并将其插入。发生的情况是,例如,如果我有 dep_id = 100 和 emp_id = 25,我无法插入 dep_id = 100 和 emp_id = 26 的记录,但我可以插入 dep_id = 100 和 emp_id = 27。我检查过如果该组合(dep_id = 100 和 emp_id = 26)存在,则选择语句。没有这样的事情。我还是做了一个 从 dep_id = 100 和 emp_id = 26 处删除并提交只是为了确定然后尝试插入,但仍然不起作用。可能出了什么问题?代码如下:修改后的DDL和Insert语句(从Eclipse控制台获取)

                                                                                    CREATE  TABLE "TestDB"."table1" 
( "dep_id" NUMBER(20,0),
"emp_id" NUMBER(20,0),
"STATUS" VARCHAR2(10 BYTE),
"PRO_LEVEL" VARCHAR2(14 BYTE),
"new_sql_stmt" VARCHAR2(4000 BYTE),
"DEL_TEM" VARCHAR2(500 BYTE),
"tab_name" VARCHAR2(4000 BYTE),
"COL_NAME" VARCHAR2(4000 BYTE),
"QUERY_TYPE" VARCHAR2(4000 BYTE),
"NAME" VARCHAR2(4000 BYTE),
"DT_MODIFIED" DATE DEFAULT SYSDATE

)

  CREATE UNIQUE INDEX "TestDB"."table1_PK" ON "TestDB"."table1" ("dep_id", "emp_id") 


INSERT into table1 (dep_id,emp_id,status,new_sql_stmt,tab_name,col_name,query_type,NAME)values('100','26','Unlock','INSERT into testTab(id_some,nm_some,id_some_origin,flag,some_code,author,order) values (''S11111111'',''trialSome00'','''',''y'','''',''100'',0)','testTab','nm_some','INSERT','trialSome00')

请注意,Insert 语句本身有另一个 Insert 语句作为值。此 Insert 语句(主要语句)在应用程序的许多其他地方使用。另外,我使用的dep_id 100 是一个测试dep_id。除了我之外没有人使用它。

最佳答案

创建 Oracle 序列:

CREATE SEQUENCE emp_id_seq MINVALUE 1 START WITH 1 INCREMENT BY 1; 

现在,您可以在代码中对该序列调用“nextval”方法(这可以使用 JDBC 或几乎所有 ORM(如果不是全部)来完成),也可以在该列上放置一个触发器,该触发器会自动获取序列中的 nextval 并在每次执行插入时将其插入表中(IIRC 在 Oracle 上,您将在触发器中使用“BEFORE INSERT”运算符)。

例如

create or replace trigger mytable_emp_id_trigger
before insert on mytable
for each row
begin
select emp_id_seq.nextval into :emp.id from dual;
end;
/

这样做是线程安全的,您永远不会看到这样的冲突发生。

如果你坚持在java代码中这样做(比如说DBA不会让你创建另一个序列,但为什么不呢,如果他们不这样做的话我会感到惊讶),那么你就必须这样做方法线程安全。可能最好使用同步方法创建一个单例(您可以创建单例 EJB)来提供下一个值。您从该单例类(而不是任何其他类或 ejb)获取 id,以避免像您现在遇到的问题(无论当前问题是否是因为这个,您现在遇到的情况是多线程与不同步发生冲突的典型情况)多线程环境中的方法)。

同时,如果您确实想了解正在发生的情况,请使用调试器并观察变量以查看现有代码正在生成什么。调试器和 watch 是您的 friend 。你最好的 friend 。

关于java - ORA 000001 违反唯一约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11436952/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com