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

Restrição exclusiva ORA-00001 violada


ORA-00001 restrição exclusiva violada é uma das mensagens comuns que recebemos frequentemente ao carregar dados.

Esse erro de violação de restrição exclusiva ORA-00001 ocorre quando você tenta executar uma instrução INSERT ou UPDATE que criou um valor duplicado em um campo restrito por um índice exclusivo.

Lista de verificação a ser executada para resolver ORA-00001


Podemos executar os seguintes itens de ação para este ORA-00001

(1) Você pode olhar para o erro e encontrar as informações de restrição com o sql abaixo
SELECT column_name, position
FROM all_cons_columns
WHERE constraint_name = '<name of the constraint in error>'
AND owner = '<table owner>'
AND table_name = '<table name>'

Agora podemos verificar os dados existentes com os dados que estamos inserindo e agir de acordo. Você pode alterar as chaves para que elas possam ser inseridas
CREATE TABLE EXAMPLE_UNIQ(
EXAM_ID NUMBER NOT NULL ENABLE,
EXAM_NAME VARCHAR2(250) NOT NULL ENABLE
CONSTRAINT UK1_EXAMPLE UNIQUE (EXAM_ID, EXAM_NAME) ENABLE
);
table created.

INSERT INTO EXAMPLE_UNIQ (EXAM_ID, EXAM_NAME) VALUES (1000, 'XYZ');
1 rows inserted.
Commit;

INSERT INTO EXAMPLE_UNIQ (EXAM_ID, EXAM_NAME) VALUES (1000, 'XYZ');
SQL Error: ORA-00001: unique constraint (UK1_EXAMPLE) violated
Solution
INSERT INTO EXAMPLE_UNIQ (EXAM_ID, EXAM_NAME) VALUES (1001, 'XYZ');
1 rows inserted.

(2)  Podemos eliminar a restrição se forem permitidas duplicatas na tabela

Exemplo
alter table <table name> drop constraint <constraint name>;

(3) A dica 11gr2 ignore_row_on_dupkey_index permite que a instrução ignore silenciosamente os erros ORA-00001.
  • A dica IGNORE_ROW_ON_DUPKEY_INDEX é diferente de outras dicas porque tem um efeito semântico. A filosofia geral explicada em "Dicas" não se aplica a essas três dicas.
  • A dica IGNORE_ROW_ON_DUPKEY_INDEX se aplica apenas a operações INSERT de tabela única. Não há suporte para operações UPDATE, DELETE, MERGE ou inserção de várias tabelas. IGNORE_ROW_ON_DUPKEY_INDEX faz com que a instrução ignore uma violação de chave exclusiva para um conjunto especificado de colunas ou para um índice especificado. Quando uma violação de chave exclusiva é encontrada, ocorre uma reversão em nível de linha e a execução é retomada com a próxima linha de entrada. Se você especificar essa dica ao inserir dados com o registro de erros DML ativado, a violação de chave exclusiva não será registrada e não causará o encerramento da instrução.

O efeito semântico dessa dica resulta em mensagens de erro se regras específicas forem violadas:
  • Se você especificar o índice, o índice deverá existir e ser exclusivo. Caso contrário, a instrução causa ORA-38913.
  • Você deve especificar exatamente um índice. Se você não especificar nenhum índice, a instrução causará ORA-38912. Se você especificar mais de um índice, a instrução causará ORA-38915.
  • Você pode especificar uma dica CHANGE_DUPKEY_ERROR_INDEX ou IGNORE_ROW_ON_DUPKEY_INDEX em uma instrução INSERT, mas não ambas. Se você especificar ambos, a instrução causará ORA-38915.
  • Como em todas as dicas, um erro de sintaxe na dica faz com que ela seja ignorada silenciosamente. O resultado será que ORA-00001 será causado, como se nenhuma dica fosse usada.
insert /*+ ignore_row_on_dupkey_index(unique_table, unique_table_idx) */
into
unique_table
(select * from non_unique_table);

Artigos relacionados

ORA-00911:caractere inválido
ORA-03113:fim de arquivo no canal de comunicação
ORA-00257
ORA-29285:erro de gravação de arquivo
ORA-29913 com tabelas externas
excluir consulta no oracle
https://docs.oracle.com/cd/E11882_01/server.112/e17766/e0.htm