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

ORA-00001 restricción única violada

ORA-00001 restricción única violada es uno de los mensajes comunes que a menudo recibimos al cargar datos.

Este error de infracción de restricción única ORA-00001 se produce cuando intenta ejecutar una instrucción INSERTAR o ACTUALIZAR que ha creado un valor duplicado en un campo restringido por un índice único.

Lista de verificación para ejecutar para resolver ORA-00001

Podemos realizar los siguientes elementos de acción para este ORA-00001

(1) Puede ver el error y encontrar la información de restricción con el siguiente sql

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>'

Ahora podemos verificar los datos existentes con los datos que estamos insertando y luego tomar las medidas correspondientes. Puedes cambiar las llaves para que se puedan insertar

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 la restricción si se permiten duplicados en la tabla

Ejemplo

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

(3) La sugerencia 11gr2 ignore_row_on_dupkey_index permite que la declaración ignore silenciosamente los errores ORA-00001.

  • La sugerencia IGNORE_ROW_ON_DUPKEY_INDEX se diferencia de otras sugerencias en que tiene un efecto semántico. La filosofía general explicada en "Sugerencias" no se aplica a estas tres sugerencias.
  • La sugerencia IGNORE_ROW_ON_DUPKEY_INDEX se aplica solo a las operaciones INSERT de una sola tabla. No se admite para las operaciones de ACTUALIZACIÓN, ELIMINACIÓN, COMBINACIÓN o inserción de varias tablas. IGNORE_ROW_ON_DUPKEY_INDEX hace que la declaración ignore una violación de clave única para un conjunto específico de columnas o para un índice específico. Cuando se encuentra una infracción de clave única, se produce una reversión a nivel de fila y la ejecución se reanuda con la siguiente fila de entrada. Si especifica esta sugerencia al insertar datos con el registro de errores DML habilitado, la infracción de clave única no se registra y no causa la finalización de la declaración.

El efecto semántico de esta sugerencia da como resultado mensajes de error si se violan reglas específicas:

  • Si especifica índice, entonces el índice debe existir y ser único. De lo contrario, la sentencia provoca ORA-38913.
  • Debe especificar exactamente un índice. Si no especifica ningún índice, la instrucción provoca ORA-38912. Si especifica más de un índice, la instrucción provoca ORA-38915.
  • Puede especificar una sugerencia CHANGE_DUPKEY_ERROR_INDEX o IGNORE_ROW_ON_DUPKEY_INDEX en una instrucción INSERT, pero no ambas. Si especifica ambos, la declaración provoca ORA-38915.
  • Al igual que con todas las sugerencias, un error de sintaxis en la sugerencia hace que se ignore silenciosamente. El resultado será que se provocará ORA-00001, como si no se hubiera utilizado ninguna pista.
insert /*+ ignore_row_on_dupkey_index(unique_table, unique_table_idx) */
into
unique_table
(select * from non_unique_table);

Artículos relacionados

ORA-00911:carácter no válido
ORA-03113:fin de archivo en el canal de comunicación
ORA-00257
ORA-29285:error de escritura de archivo
ORA-29913 con tablas externas
eliminar consulta en Oracle
https://docs.oracle.com/cd/E11882_01/server.112/e17766/e0.htm