sql >> Base de Datos >  >> RDS >> Oracle

Excepción de violación de restricción ORA-00001

Una restricción única hace cumplir, bueno, la singularidad. Permitirá nulos, a diferencia de una restricción de clave principal .

Su error significa que está insertando datos duplicados cuando la base de datos se ha configurado para prohibir explícitamente eso.

Puede averiguar qué restricciones hay en una tabla ejecutando la siguiente consulta en todas las restricciones . El enlace decodifica la columna CONSTRAINT_TYPE , por ejemplo P es una clave principal y U una clave única.

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

Para averiguar qué columnas están en una restricción, use all_cons_columns en su lugar, o combinando los dos en una sola consulta:

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'

A cualquiera de las consultas, puede agregar la condición adicional and constraint_name = 'IDX_CO_DETAILS' para averiguar los detalles de la restricción específica que parece estar causando su problema.

Su comentario es un poco sorprendente por un par de razones. Incluso una restricción creada por el sistema, por ejemplo, una que se definió en línea cuando se creó la tabla sin especificar un nombre, debería aparecer. Además, el nombre de la restricción IDX... implica que es un índice.

SI ejecuta la siguiente consulta, debería decirle si el objeto existe en la base de datos:

select *
  from all_objects
 where object_name = 'IDX_CO_DETAILS'

Espero que el OBJECT_TYPE devuelto por esta consulta es 'INDEX' .

A continuación, la siguiente consulta devolverá todos los índices con ese nombre, el tipo de índice, la tabla con la que está asociado y el propietario de esa tabla.

select *
  from all_indexes
 where index_name = 'IDX_CO_DETAILS'

A juzgar por su error, esperaría además que la columna UNIQUNESS devuelto por esta consulta es 'UNIQUE' .

Esto debería ayudarte a localizar el objeto.

También puede usar el paquete del sistema dbms_metadata para rastrear el DDL del objeto; ten cuidado, te devuelve un clob.

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

el parámetro schema es opcional.