sql >> Databasteknik >  >> RDS >> Oracle

ORA-00001 unik begränsning överträtt

ORA-00001 unika begränsningar som överträtts är ett av de vanliga meddelandena vi ofta får när vi laddar data.

Detta ORA-00001 unika begränsningsfel uppstår när du försökte köra en INSERT- eller UPDATE-sats som har skapat ett dubblettvärde i ett fält begränsat av ett unikt index.

Kontrolllista som ska köras för att lösa ORA-00001

Vi kan utföra följande åtgärder för denna ORA-00001

(1) Du kan titta på felet och hitta begränsningsinformationen med nedanstående 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>'

Nu kan vi kontrollera befintliga data med de data vi infogar och sedan vidta åtgärder i enlighet med detta. Du kan ändra nycklarna så att de kan infogas

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)  Vi kan ta bort begränsningen om dubbletter tillåts i tabellen

Exempel

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

(3) 11gr2-tipset ignore_row_on_dupkey_index tillåter uttalandet att tyst ignorera ORA-00001-fel.

  • IGNORE_ROW_ON_DUPKEY_INDEX-tipset skiljer sig från andra tips genom att de har en semantisk effekt. Den allmänna filosofin som förklaras i "Tips" gäller inte för dessa tre tips.
  • IGNORE_ROW_ON_DUPKEY_INDEX-tipset gäller endast INSERT-operationer i en tabell. Det stöds inte för UPDATE, DELETE, MERGE eller multitable insert-operationer. IGNORE_ROW_ON_DUPKEY_INDEX gör att satsen ignorerar en unik nyckelöverträdelse för en specificerad uppsättning kolumner eller för ett specificerat index. När en unik nyckelöverträdelse påträffas sker en återställning på radnivå och exekveringen återupptas med nästa inmatningsrad. Om du anger denna ledtråd när du infogar data med DML-felloggning aktiverad, loggas inte den unika nyckelintrånget och orsakar inte uttalandeavbrott.

Den semantiska effekten av denna ledtråd resulterar i felmeddelanden om specifika regler överträds:

  • Om du anger index måste indexet finnas och vara unikt. Annars orsakar uttalandet ORA-38913.
  • Du måste ange exakt ett index. Om du inte anger något index, orsakar satsen ORA-38912. Om du anger mer än ett index, orsakar satsen ORA-38915.
  • Du kan ange antingen en CHANGE_DUPKEY_ERROR_INDEX eller IGNORE_ROW_ON_DUPKEY_INDEX ledtråd i en INSERT-sats, men inte båda. Om du anger båda, orsakar satsen ORA-38915.
  • Som med alla tips, gör ett syntaxfel i tipset att det ignoreras tyst. Resultatet kommer att bli att ORA-00001 orsakas, precis som om ingen ledtråd användes.
insert /*+ ignore_row_on_dupkey_index(unique_table, unique_table_idx) */
into
unique_table
(select * from non_unique_table);

Relaterade artiklar

ORA-00911:ogiltigt tecken
ORA-03113:slutet av filen på kommunikationskanalen
ORA-00257
ORA-29285:filskrivfel
ORA-29913 med externa tabeller
ta bort fråga i oracle
https://docs.oracle.com/cd/E11882_01/server.112/e17766/e0.htm


  1. Hur RANK() fungerar i SQL Server

  2. Rekursiv fråga i Oracle

  3. Hur man får distinkta poster från en tabell i SQL Server - SQL Server / TSQL Tutorial 112

  4. Hur man ersätter NULL med ett annat värde i SQL Server – ISNULL()