【发布时间】:2012-07-11 16:15:51
【问题描述】:
我有一个插入到具有 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),则选择语句。没有那种东西。我还是做了一个 DELETE from where dep_id = 100 and emp_id = 26 and Commit 只是为了确定,然后尝试插入,但它仍然不起作用。可能有什么问题?以下是代码:修改后的 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')
请注意,插入语句本身有另一个插入语句作为值。这个插入语句(主要的)在应用程序的许多其他地方使用。另外,我使用 100 的 dep_id 是一个测试 dep_id。除了我没有人使用它。
【问题讨论】:
-
你确定你的java代码是同步的吗?它可能被多个线程调用。
-
它是一个没有任何线程的简单应用
-
你所描述的没有意义。您可能遗漏了某些部分(即另一个会话,可能运行不同的应用程序,正在插入并提交带有
dep_id=100和emp_id=26的行)或者您的描述不正确。您能否发布 DDL 以创建表并发布一些示例代码,我们可以在我们的机器上运行以复制问题? -
@Raghu - 你知道
max(emp_id) + 1不会在多用户环境中工作,对吧?同时运行的两个会话将看到相同的max(emp_id),并将尝试插入具有相同emp_id值的行,从而导致您描述的错误。您是否有理由不使用序列来生成密钥? -
Nouuu,让我们去吃choppa吧! Ñññaaggghhhhh... 多用户 + 选择最大值 = 你不想活了。如果你想活下去,跟我来使用sequence/auto_increment :)
标签: java oracle insert ora-00001 batch-updates