Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Exceção de violação de restrição ORA-00001


Uma restrição exclusiva impõe, bem, singularidade. Ele permitirá valores nulos, ao contrário de uma restrição de chave primária .

Seu erro significa que você está inserindo dados duplicados quando o banco de dados foi configurado para proibir explicitamente isso.

Você pode descobrir quais restrições estão em uma tabela executando a seguinte consulta em todas as restrições . O link decodifica a coluna CONSTRAINT_TYPE , por exemplo P é uma chave primária e U uma chave única.
select *
  from all_constraints uc
 where uc.table_name = 'MY_TABLE'
   and owner = 'DBSCHEMA'

Para descobrir quais colunas estão em uma restrição, use all_cons_columns em vez disso, ou combinando os dois em uma 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'

Para qualquer consulta, você pode adicionar a condição adicional and constraint_name = 'IDX_CO_DETAILS' para descobrir detalhes da restrição específica que parece estar causando o problema.

Seu comentário é um pouco surpreendente por alguns motivos. Mesmo uma restrição criada pelo sistema, por exemplo, uma que foi definida em linha quando a tabela foi criada sem um nome especificado, deve aparecer. Além disso, o nome da restrição IDX... implica que é um índice.

SE você executar a seguinte consulta, ela deverá informar se o objeto existe no banco de dados:
select *
  from all_objects
 where object_name = 'IDX_CO_DETAILS'

Eu esperaria que o OBJECT_TYPE retornado por esta consulta é 'INDEX' .

Em seguida, a consulta a seguir retornará todos os índices com esse nome, o tipo de índice, a tabela à qual está associado e o proprietário dessa tabela.
select *
  from all_indexes
 where index_name = 'IDX_CO_DETAILS'

A julgar pelo seu erro, espero que a coluna UNIQUNESS retornado por esta consulta é 'UNIQUE' .

Isso deve ajudá-lo a rastrear o objeto.

Você também pode usar o pacote do sistema dbms_metadata rastrear o DDL do objeto; tenha cuidado, ele retorna um clob.
select dbms_metadata.get_ddl('INDEX','IDX_CO_DETAILS', schema => 'DBSCHEMA') 
  from dual

o parâmetro schema é opcional.