当前位置: 首页 > 知识库问答 >
问题:

ORA-00001:违反唯一约束(System.Browsers_PK)

江宏伟
2023-03-14
String Qry = INSERT INTO browsers (browsers.browser,browsers.engine,browsers.platform,browsers.version,browsers.grade) VALUES ('Alans browser','Gecko','every','1.0','U') RETURNING id INTO :ID
OracleConnection conn = new OracleConnection(...);
OracleCommand cmd = null;
...
cmd = new OracleCommand(Qry, conn);
OracleParameter prm = new OracleParameter();
prm = new OracleParameter(":ID", OracleDbType.Int32, ParameterDirection.ReturnValue);
cmd.Parameters.Add(prm);
cmd.ExecuteNonQuery(); //this line throws error
query.setNewRecordID(cmd.Parameters[":ID"].Value.ToString());
...

创建序列“system”。“browsers_seq”MINVALUE 1 MAXVALUE

触发器:

create or replace trigger BROWSERS_TRG  
before insert on "SYSTEM"."BROWSERS" 
for each row 
begin  
   if inserting then 
      if :NEW."ID" is null then 
         select BROWSERS_SEQ.nextval into :NEW."ID" from dual; 
      end if; 
   end if; 
end;

共有1个答案

吴同
2023-03-14

我认为你的序列有问题(我不能按原样编译)。我把它去掉了,它起作用了。

我在我的SCOTT(示例)模式中创建了一个类似的场景,如下所示:

 SCOTT@dev> CREATE TABLE "SCOTT"."EMP2"
  2    (
  3      "EMPNO"    NUMBER(4,0),
  4      "ENAME"    VARCHAR2(10 BYTE),
  5      "JOB"      VARCHAR2(9 BYTE),
  6      "MGR"      NUMBER(4,0),
  7      "HIREDATE" DATE,
  8      "SAL"      NUMBER(7,2),
  9      "COMM"     NUMBER(7,2),
 10      "DEPTNO"   NUMBER(2,0)
 11    )
 12    TABLESPACE "SYSTEM" ;

Table created.

SCOTT@dev> CREATE UNIQUE INDEX "SCOTT"."EMP2_EMPNO" ON "SCOTT"."EMP2"
  2    (
  3      "EMPNO"
  4    )
  5    TABLESPACE "SYSTEM" ;

Index created.

SCOTT@dev> set define off;
SCOTT@dev> ALTER TABLE "SCOTT"."EMP2" ADD PRIMARY KEY ("EMPNO");

Table altered.

SCOTT@dev>  CREATE SEQUENCE EMP2_SEQ MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 21 CACHE 20 NOORDER NOCYCLE  ;

Sequence created.

SCOTT@dev> CREATE OR REPLACE TRIGGER EMP2_TRG before
  2    INSERT ON SCOTT.EMP2 FOR EACH row BEGIN IF inserting THEN IF :NEW.EMPNO IS NULL THEN
  3    SELECT EMP2_SEQ.NEXTVAL INTO :NEW.EMPNO FROM dual;
  4  END IF;
  5  END IF;
  6  END;
  7  /

Trigger created.

SCOTT@dev> commit;

Commit complete.

SCOTT@dev> INSERT INTO EMP2
  2  (ENAME)
  3  VALUES
  4  ('FRED')
  5  /

1 row created.

SCOTT@dev> commit;

Commit complete.

因此,顺序似乎是罪魁祸首。

 类似资料:
  • 我正试图插入数据库,但我在日志上看到了这样的消息: 我找到了这个查询以获取违反的密钥:

  • 以下是SQL部分,我在调试代码时出错: ORA-00001:唯一约束主键违反T_LIAV_AGENT_STATE_APPROVAL... 这是主键约束依赖的2列AV_NAME_ID,AV_STATE... 我没有重复的数据...你认为还有其他原因吗?

  • 我有两张表, 但我做了一个组声明,以确保from\t的名称是唯一的: 我不确定我是否正确理解了这个问题。我尽了我所能,但仍然没有运气。

  • 问题内容: 我正在使用Oracle数据库。我们的服务呼叫频繁失败。当我查看日志时,在表上看到以下异常 java.sql.BatchUpdateException:ORA-00001:违反了唯一约束(DBSCHEMA.IDX_CO_DETAILS)。 我已经检查了表上索引的索引名称DBSCHEMA.IDX_CO_DETAILS。 它不包含任何列的(INCLUDE_COLUMN为null)。我怎么知道

  • 问题内容: 目标: 交换两个记录的主键,而不会遇到ORA-00001:违反了唯一约束。“可行”的解决方案(在下文中)只是一个破解。是否有一项功能/技术可以将约束执行推迟到提交事务之前? motivation -使用此数据的遗留应用程序存在设计缺陷,并且依赖于ID顺序和值-请求是按以下方式交换PK值: What doesn’t Work: Hack/Solution that ‘works’ Tab

  • 我有一个迁移脚本之间的2个不同的模式数据库。脚本做了3件事:1。禁用约束2。将记录从旧架构插入到新架构3。启用约束 我发现这两个约束在旧的模式中是不存在的。这2个表的表结构定义有什么问题吗?