ORA 000001违反了唯一约束

时间:2012-07-11 16:15:51

标签: java oracle insert ora-00001 batch-updates

我有一个表语句的Insert语句,其主键为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并且提交的地方删除 只是为了确定然后尝试插入,但它仍然无法正常工作。可能有什么问题? Follwing是代码:Modified 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语句作为值。此插入语句(主要语句)在应用程序的许多其他位置使用。另外,我使用100的dep_id是测试dep_id。除了我,没有人使用它。

1 个答案:

答案 0 :(得分:1)

创建Oracle序列:

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

现在你可以在代码中调用该序列上的“nextval”方法(这可以通过JDBC或几乎每个ORM完成,如果不是全部的话),或者你可以在该列上自动获取触发器从序列开始的nextval并在你进行插入时将它插入表中(在oracle上使用IIRC,你将在触发器中使用'BEFORE INSERT'操作符)。

e.g。

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不会让你创建另一个序列,但是为什么 - 如果他们没有,我会感到惊讶),那么你必须做到这一点方法线程安全。最好使用synchronized方法创建单例(您可以创建单例EJB)以提供下一个值。你从那个单例类得到你的id,而不是任何其他类或ejb来避免你现在遇到的问题(当前问题是否因为这个问题,你现在经历的是多线程与非同步冲突的典型情况)多线程环境中的方法。)

与此同时,如果您真的想了解正在发生的事情,请使用您的调试器并观察您的变量以查看您现有代码的产生情况。调试器和手表是你的朋友。你最好的朋友。