Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Einschränkungsverletzung Ausnahme ORA-00001

Eine eindeutige Einschränkung erzwingt, nun ja, Einzigartigkeit. Im Gegensatz zu einer Primary Key Constraint .

Ihr Fehler bedeutet, dass Sie doppelte Daten einfügen, obwohl die Datenbank so konfiguriert wurde, dass dies explizit verboten wird.

Sie können herausfinden, welche Einschränkungen für eine Tabelle gelten, indem Sie die folgende Abfrage auf all_constraints . Der Link dekodiert die Spalte CONSTRAINT_TYPE , zum Beispiel P ist ein Primärschlüssel und U ein eindeutiger Schlüssel.

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

Um herauszufinden, welche Spalten in einer Einschränkung enthalten sind, verwenden Sie all_cons_columns stattdessen oder die Kombination der beiden zu einer Abfrage:

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'

Zu jeder Abfrage können Sie die zusätzliche Bedingung and constraint_name = 'IDX_CO_DETAILS' hinzufügen um Einzelheiten über die spezifische Einschränkung herauszufinden, die Ihr Problem zu verursachen scheint.

Ihr Kommentar ist aus mehreren Gründen etwas überraschend. Sogar eine vom System erstellte Einschränkung, beispielsweise eine, die beim Erstellen der Tabelle ohne Angabe eines Namens inline definiert wurde, sollte angezeigt werden. Auch der Beschränkungsname IDX... impliziert, dass es sich um einen Index handelt.

Wenn Sie die folgende Abfrage ausführen, sollte sie Ihnen mitteilen, ob das Objekt in der Datenbank vorhanden ist:

select *
  from all_objects
 where object_name = 'IDX_CO_DETAILS'

Ich würde erwarten, dass der OBJECT_TYPE zurückgegeben von dieser Abfrage ist 'INDEX' .

Anschließend gibt die folgende Abfrage jeden Index mit diesem Namen, den Typ des Index, die Tabelle, mit der er verknüpft ist, und den Besitzer dieser Tabelle zurück.

select *
  from all_indexes
 where index_name = 'IDX_CO_DETAILS'

Nach Ihrem Fehler zu urteilen, würde ich weiterhin erwarten, dass die Spalte UNIQUNESS von dieser Abfrage zurückgegeben wird, ist 'UNIQUE' .

Dies sollte Ihnen helfen, das Objekt aufzuspüren.

Sie können auch das Systempaket dbms_metadata um die DDL des Objekts aufzuspüren; Seien Sie vorsichtig, es gibt einen Clob zurück.

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

den Parameter schema ist optional.