Oracle
 sql >> Database >  >> RDS >> Oracle

Eccezione di violazione dei vincoli ORA-00001

Un vincolo unico impone, beh, l'unicità. Consentirà null, a differenza di un vincolo di chiave primaria .

Il tuo errore significa che stai inserendo dati duplicati quando il database è stato configurato per proibirlo esplicitamente.

Puoi scoprire quali vincoli sono presenti su una tabella eseguendo la query seguente su tutti i_vincoli . Il link decodifica la colonna CONSTRAINT_TYPE , ad esempio P è una chiave primaria e U una chiave univoca.

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

Per scoprire quali colonne sono in un vincolo, utilizzare all_cons_columns invece, o combinando i due in un'unica query:

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'

Ad entrambe le query puoi aggiungere la condizione aggiuntiva and constraint_name = 'IDX_CO_DETAILS' per scoprire i dettagli del vincolo specifico che sembra causare il tuo problema.

Il tuo commento è un po' sorprendente per un paio di motivi. Anche un vincolo creato dal sistema, ad esempio uno che è stato definito in linea quando è stata creata la tabella senza specificare un nome, dovrebbe essere visualizzato. Inoltre, il nome del vincolo IDX... implica che sia un indice.

SE esegui la seguente query, dovrebbe dirti se l'oggetto esiste nel database:

select *
  from all_objects
 where object_name = 'IDX_CO_DETAILS'

Mi aspetto che il OBJECT_TYPE restituito da questa query è 'INDEX' .

Successivamente la query seguente restituirà ogni indice con quel nome, il tipo di indice, la tabella a cui è associato e il proprietario di quella tabella.

select *
  from all_indexes
 where index_name = 'IDX_CO_DETAILS'

A giudicare dal tuo errore, mi aspetterei ulteriormente che la colonna UNIQUNESS restituito da questa query è 'UNIQUE' .

Questo dovrebbe aiutarti a rintracciare l'oggetto.

Puoi anche utilizzare il pacchetto di sistema dbms_metadata per rintracciare il DDL dell'oggetto; fai attenzione, restituisce una palla.

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

il parametro schema è facoltativo.