ORA-00001 Unikátní omezení porušeno je jednou z běžných zpráv, které často dostáváme při načítání dat.
Chyba porušení jedinečného omezení ORA-00001 nastane, když jste se pokusili provést příkaz INSERT nebo UPDATE, který vytvořil duplicitní hodnotu v poli omezeném jedinečným indexem.
Zaškrtněte seznam pro spuštění k vyřešení ORA-00001
Pro tento ORA-00001
můžeme provést následující akce(1) Můžete se podívat na chybu a najít informace o omezení pomocí níže uvedeného 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>'
Nyní můžeme zkontrolovat existující data pomocí dat, která vkládáme, a podle toho podniknout kroky. Klíče můžete změnit tak, aby je bylo možné vložit
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) Pokud jsou v tabulce povoleny duplikáty
, můžeme omezení zrušitPříklad
alter table <table name> drop constraint <constraint name>;
(3) Nápověda 11gr2 ignore_row_on_dupkey_index umožňuje příkazu tiše ignorovat chyby ORA-00001.
- Nápověda IGNORE_ROW_ON_DUPKEY_INDEX se liší od ostatních v tom, že mají sémantický účinek. Obecná filozofie vysvětlená v „Rady“ se na tyto tři rady nevztahuje.
- Nápověda IGNORE_ROW_ON_DUPKEY_INDEX platí pouze pro operace INSERT s jednou tabulkou. Není podporováno pro operace UPDATE, DELETE, MERGE ani operace vkládání více tabulek. IGNORE_ROW_ON_DUPKEY_INDEX způsobí, že příkaz bude ignorovat jedinečné narušení klíče pro zadanou sadu sloupců nebo pro zadaný index. Když je zjištěno jedinečné narušení klíče, dojde k vrácení na úrovni řádku a provádění bude pokračovat s dalším vstupním řádkem. Pokud zadáte tuto nápovědu při vkládání dat s povoleným protokolováním chyb DML, pak se porušení jedinečného klíče nezaprotokoluje a nezpůsobí ukončení příkazu.
Sémantický účinek této nápovědy má za následek chybové zprávy, pokud jsou porušena určitá pravidla:
- Pokud zadáte index, musí index existovat a být jedinečný. Jinak příkaz způsobí ORA-38913.
- Musíte zadat přesně jeden index. Pokud nezadáte žádný index, pak příkaz způsobí ORA-38912. Pokud zadáte více než jeden index, pak příkaz způsobí ORA-38915.
- V příkazu INSERT můžete zadat nápovědu CHANGE_DUPKEY_ERROR_INDEX nebo IGNORE_ROW_ON_DUPKEY_INDEX, ale ne obojí. Pokud zadáte oba, pak příkaz způsobí ORA-38915.
- Stejně jako u všech nápověd způsobí chyba syntaxe v nápovědě její ignorování. Výsledkem bude, že bude způsobena ORA-00001, jako by nebyla použita žádná nápověda.
insert /*+ ignore_row_on_dupkey_index(unique_table, unique_table_idx) */ into unique_table (select * from non_unique_table);
Související články
ORA-00911:neplatný znak
ORA-03113:konec souboru na komunikačním kanálu
ORA-00257
ORA-29285:chyba při zápisu souboru
ORA-29913 s externími tabulkami
smazat dotaz v oracle
https://docs.oracle.com/cd/E11882_01/server.112/e17766/e0.htm