`
xm_koma
  • 浏览: 384777 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ORA-00001: unique constraint (BBASS.PK98) violated 主键约束问题

阅读更多

ORA-00001: unique constraint (BBASS.PK98) violated   主键约束问题

 

BBASS.PK98为当前要插入数据的表中的一个主键名。

 

出现这个错误的原因:主键存在重复的问题,在bbass平台中(包括以后很多时候),很多model在自动生成主键的时候,会采用sequence的方式,并且很多时候hibernate的配置文件中会将不同的model的sequence名称配置为相同的名称。

在网上查看了一些资料:

发现不少说这是一个9i的BUG,10g中已经fixed。这是我查到的原文:

ORA-00001 PERFSTAT.STATS$SQL_SUMMARY_PK2009-03-13 19:23又遇到了ORA-00001 PERFSTAT.STATS$SQL_SUMMARY_PK ,记得当时好像disable一下就可以了,今天有空metalink上查了一下,原来是9i的bug,10g中fixed.

 Database Bug.2784796 - ORA-00001 UNIQUE CONSTRAINT (PERFSTAT.STATS$SQL_SUMMARY_PK) VIOLATED.

 解决方法:

1.ALTER TABLE PERFSTAT.STATS$SQL_SUMMARY MODIFY CONSTRAINT STATS$SQL_SUMMARY_PK DISABLE NOVALIDATE;

2.1. Please run the following sql statements: (Please be sure the view STATS$V_$SQLXS created successfully in the sys schema) sqlplus " / as sysdba"

SQL> spool run_statspack.txt

SQL> create or replace view STATS$V_$SQLXS as select max(sql_text) sql_text , sum(sharable_mem) sharable_mem , sum(sorts) sorts , min(module) module , sum(loaded_versions) loaded_versions , sum(fetches) fetches , sum(executions) executions , sum(loads) loads , sum(invalidations) invalidations , sum(parse_calls) parse_calls , sum(disk_reads) disk_reads , sum(buffer_gets) buffer_gets , sum(rows_processed) rows_processed , max(command_type) command_type , address address , hash_value hash_value , count(1) version_count , sum(cpu_time) cpu_time , sum(elapsed_time) elapsed_time , max(outline_sid) outline_sid , max(outline_category) outline_category , max(is_obsolete) is_obsolete , max(child_latch) child_latch from v$sql where ( plan_hash_value > 0 or executions > 0 or parse_calls > 0 or disk_reads > 0 or buffer_gets > 0) group by hash_value, address;

SQL> select owner,object_name from dba_objects where status ='INVALID';

SQL> @?/rdbms/admin/utlrp

SQL> select owner,object_name from dba_objects where status ='INVALID';

SQL> conn perfstat/perfstat_password

SQL> execute statspack.snap(i_snap_level=>5);

SQL> spool off;

 

 

 

 

 

 

 


 

 

但是针对主键重复的问题是:save数据时,无法插入新的数据,

我们的解决方法重置sequence。在sqlplus中或者PS/SQL中手工重置一下sequence的值(前提是查出所有用同一sequence名称的表中最大的id)。

然后可以重置sequence中的start with的值,但是oracle是不允许直接这个语句(ALTER SEQUENCE SEQ_OTHERID start with 50000;)执行的。所以解决的方法是:

1、直接先drop再create,DROP SEQUENCE SEQ_OTHERID (SEQ_OTHERID 是sequence_name);

--SEQ_OTHERID 是sequence_name

SQL>DROP SEQUENCE SEQ_OTHERID;

 -- Create sequence

SQL>create sequence SEQ_OTHERID minvalue 1 maxvalue 999999999999999999999999999 start with 50000 increment by 1 cache 20;

 

 

 

 

 

 

 


 然后可以

SQL>select SEQ_OTHERID.nextval from dual;查看新的 start with的值,已经改变为50000了。 

注意:

在生产环境中:也就是说这些sequence正在被用到的时候,如果drop掉的话,就会出现错误。

 

所以可以采用下面的解决方法:

2、可以先修改increment by的值,这个是可以直接alter的

SQL>ALTER SEQUENCE SEQ_OTHERID INCREMENT BY 50000;

再执行下面的SQL语句

SQL>select SEQ_OTHERID.nextval from dual;

执行完后,start with的值就变为之前sequence中的start with+50000的值,

再将INCREMENT BY 修改回来

SQL>ALTER SEQUENCE SEQ_OTHERID INCREMENT BY 1;

 上述过程就相当于修改了start with的值。

 

再贴一个网上搜到的方法:

--create procedure pro_test for test

create or replace procedure pro_reset_seq(v_seqname varchar2) as n_temp number(10);

 s_tsql varchar2(100);

 begin execute immediate ' select ' || v_seqname || '.nextval from dual' into n_temp; if n_temp <> 1 then n_temp := -(n_temp-1); s_tsql := ' alter sequence ' || v_seqname || ' increment by ' || n_temp; execute immediate s_tsql; execute immediate ' select ' || v_seqname || '.nextval from dual' into n_temp; s_tsql := ' alter sequence ' || v_seqname || ' increment by 1 '; execute immediate s_tsql; end if; end;

/ 在SQL PLUS中调用 exec pro_reset_seq('seq_test'); 

/ 你所希望重置的序列就可以重新从1开始递增了。

分享到:
评论

相关推荐

    oracle常见错误号

    15. ORA-00001:unique constraint (BUSHR.PK_T_DIC_BMFL) violated - 违反唯一约束,尝试插入重复的主键值。确保插入的数据不违反唯一性约束。 16. ORA-01031:insufficient privileges - 没有足够的权限执行操作...

    oracle报错大全(珍藏版)

    #### ORA-00001: Unique Constraint Violated 当尝试插入或更新违反唯一约束的数据时触发此错误。例如,在具有唯一索引的列上插入重复数据。 #### ORA-00017: Rollback Segment Full 在进行事务回滚操作时,如果...

    ORACLE ORA错误大全

    1. **ORA-00001: unique constraint (owner.constraint) violated** - 这个错误表示尝试插入的数据违反了一个唯一约束条件。解决方法通常是检查数据是否重复,或者修改数据以满足唯一性要求。 2. **ORA-00017: ...

    oracle错误代码大全

    #### ORA-00001: Unique constraint violated - **解释**: 当尝试插入或更新的数据违反了唯一性约束时触发此错误。 - **解决方案**: 检查数据是否重复,并确保每个字段值都是唯一的。 #### ORA-00017: Resource ...

    oracle 错误一览表

    #### ORA-00001: Unique constraint violated - **描述**:当尝试插入或更新一个行时,违反了唯一性约束。 - **解决方法**:确保数据不违反任何唯一性约束,或者修改约束以适应数据。 #### ORA-00017: Rollback ...

    Oracle 错误大全

    ##### ORA-00001: Unique Constraint Violated - **描述**:当尝试插入或更新违反了唯一约束的数据时出现。 - **解决方法**: - 检查数据是否违反了表定义中的唯一约束。 - 使用`ALTER TABLE`语句删除或修改该约束...

    Oracle_Errors描述

    1. **ORA-00001: unique constraint violated** 这个错误意味着违反了唯一性约束,即尝试插入的数据在指定的唯一索引或主键列中已经存在。解决方法包括检查插入数据的唯一性,或者如果数据本应重复,可能需要调整...

    Oracle官方文档CHM合集-Oracle9i错误代码

    这些错误代码通常伴随着一个错误消息,描述了问题的具体情况,比如违反了唯一性约束导致的"ORA-00001: unique constraint violated"。 学习和理解Oracle9i错误代码,可以提升数据库管理员的故障排除能力。错误代码...

    Oracle错误一览表

    #### ORA-00001: Unique constraint (table name.column name) violated 当尝试插入或更新违反了唯一性约束的记录时,会触发此错误。例如,如果某列被定义为唯一键,而尝试插入一个已存在的值,就会引发ORA-00001...

    Oracle 9I的错误提示解释

    例如,"ORA-00001: unique constraint violated" 这个错误意味着你在尝试插入或更新数据时违反了唯一性约束,即试图插入的数据在指定列中已经存在。解决这个问题的方法包括检查插入的数据是否正确,或者修改约束条件...

    oracle 10g错误代码手册

    - **ORA-00001: unique constraint (SYS.C0012345) violated** - **含义**:尝试插入一条违反唯一约束的数据。 - **解决方法**:检查数据是否符合约束条件,确保唯一性。 - **ORA-00936: missing expression** - ...

    常见ORA解决方案.pdf

    1. **ORA-00001: unique constraint (SYS.UK_XXXXX) violated** - **解释**:此错误表示尝试插入违反唯一约束的数据。这可能是由于尝试向设置了唯一索引的字段插入重复值导致的。 - **解决方案**: - 检查数据...

    oracle电子文档:数据库约束.rar

    1. **违反约束的错误**:如`ORA-00001: unique constraint violated`表示尝试插入的数据违反了唯一性约束。必须识别并修正导致冲突的数据。 2. **级联删除与更新**:外键约束的ON DELETE CASCADE和ON UPDATE ...

    Ora92ErrMsg.rar_ora92数据库_oracle

    例如,"ORA-00001: unique constraint violated"表示尝试插入或更新的数据违反了唯一性约束,可能是因为试图插入已存在的键值。 学习和理解这些错误代码对于数据库管理员(DBA)和开发者至关重要,因为它们能指导...

    oracle error message

    1. **ORA-00001: unique constraint (SYS.UNQ$XXXXXXXX) violated** - **含义**:当尝试插入违反唯一约束的数据时,会触发此错误。 - **原因**:可能是由于试图向具有唯一索引或唯一约束的列中插入重复值。 - **...

    取oracle的error code

    例如,尝试插入一个违反唯一约束的记录,你会看到类似"ORA-00001: unique constraint violated"的错误。 2. **日志文件**:Oracle的服务器和客户端日志文件,如alert.log(服务器端)和trace文件(客户端或服务器端...

    ORACLE 错误码大全

    1. **错误描述**:每个错误码都有一个详细的描述,解释了错误发生的原因,例如“ORA-00001: unique constraint violated”表示违反了唯一性约束,这意味着试图插入或更新的数据违反了某个唯一索引或唯一约束。...

    ora_错误代码

    例如,"ORA-00001"表示"unique constraint violated"(唯一性约束违反),意味着试图插入或更新的数据违反了表的唯一性约束。 3. **查询错误代码**:在Oracle文档中,可以通过错误代码快速查找错误详情。Oracle提供...

    Oracle唯一约束.txt

    这条语句会失败,并抛出错误信息`ORA-00001: unique constraint (SYS.NAME_UNIQUE) violated`,提示唯一约束被违反。 3. **插入包含空值的数据**: ```sql INSERT INTO unique_test (id, fname, lname) VALUES ...

    oracle 11g em重建报唯一约束错误解决方法

    在尝试配置Oracle 11g Enterprise Manager (EM) 时,可能会遇到一个特定的错误,即“ORA-00001: unique constraint (SYSMAN.PARAMETERS_PRIMARY_KEY) violated”。这个错误表明在尝试插入或更新数据到SYSMAN....

Global site tag (gtag.js) - Google Analytics