sql >> Databáze >  >> RDS >> Oracle

Výjimka z porušení omezení ORA-00001

Jedinečné omezení prosazuje, no, jedinečnost. Na rozdíl od omezení primárního klíče bude povolovat hodnoty null .

Vaše chyba znamená, že vkládáte duplicitní data, když byla databáze nakonfigurována tak, aby to výslovně zakazovala.

Jaká omezení jsou v tabulce, můžete zjistit spuštěním následujícího dotazu na all_constraints . Odkaz dekóduje sloupec CONSTRAINT_TYPE , například P je primární klíč a U jedinečný klíč.

select *
  from all_constraints uc
 where uc.table_name = 'MY_TABLE'
   and owner = 'DBSCHEMA'

Chcete-li zjistit, které sloupce jsou v omezení, použijte all_cons_columns místo toho nebo zkombinováním těchto dvou do jednoho dotazu:

select uc.*, ucc.column_name, ucc.position
  from all_constraints uc
  join all_cons_columns ucc
    on uc.owner = ucc.owner
   and uc.table_name = ucc.table_name
   and uc.constraint_name = ucc.constraint_name
 where uc.table_name = 'MY_TABLE'
   and uc.owner = 'DBSCHEMA'

Ke každému dotazu můžete přidat další podmínku and constraint_name = 'IDX_CO_DETAILS' zjistit podrobnosti o konkrétním omezení, které se zdá být příčinou vašeho problému.

Váš komentář je trochu překvapivý z několika důvodů. Mělo by se zobrazit i omezení vytvořené systémem, například takové, které bylo definováno in-line, když byla tabulka vytvořena, aniž by byl zadán název. Také název omezení IDX... znamená, že se jedná o index.

POKUD spustíte následující dotaz, měl by vám sdělit, zda objekt v databázi existuje:

select *
  from all_objects
 where object_name = 'IDX_CO_DETAILS'

Očekával bych, že OBJECT_TYPE vrácený tímto dotazem je 'INDEX' .

V návaznosti na to následující dotaz vrátí každý index s tímto názvem, typem indexu, tabulkou, ke které je přidružen, a vlastníkem této tabulky.

select *
  from all_indexes
 where index_name = 'IDX_CO_DETAILS'

Soudě podle vaší chyby bych dále očekával, že sloupec UNIQUNESS vrácená tímto dotazem je 'UNIQUE' .

To by vám mělo pomoci objekt vystopovat.

Můžete také použít systémový balíček dbms_metadata vystopovat DDL objektu; buďte opatrní, vrátí to kus.

select dbms_metadata.get_ddl('INDEX','IDX_CO_DETAILS', schema => 'DBSCHEMA') 
  from dual

parametr schema je volitelné.




  1. Příkaz IF není v této pozici platný

  2. Je možné zabít jeden dotaz v oracle bez zabití relace?

  3. Proč to_timestamp_tz společnosti Oracle vrací nesprávný čas a/nebo časové pásmo?

  4. Jak číst a aktualizovat databázi SQLite pomocí ListView v Androidu?