ORA-00001 нарушение на уникалното ограничение е едно от често срещаните съобщения, които често получаваме при зареждане на данни.
Тази грешка при нарушаване на уникално ограничение ORA-00001 възниква, когато вие сте се опитали да изпълните израз INSERT или UPDATE, който е създал дублирана стойност в поле, ограничено от уникален индекс.
Проверете списък за изпълнение, за да разрешите ORA-00001
Можем да извършим следните действия за този ORA-00001
(1) Можете да разгледате грешката и да намерите информацията за ограничението с помощта на 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>'
Сега можем да проверим съществуващите данни с данните, които вмъкваме и след това да предприемем съответните действия. Можете да промените клавишите, така че да могат да бъдат поставени
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) Можем да премахнем ограничението, ако в таблицата са разрешени дубликати
Пример
alter table <table name> drop constraint <constraint name>;
(3) Намекът 11gr2 ignore_row_on_dupkey_index позволява на оператора тихо да игнорира грешки ORA-00001.
- Намекът IGNORE_ROW_ON_DUPKEY_INDEX е различен от другите съвети, тъй като имат семантичен ефект. Общата философия, обяснена в „Съвети“, не важи за тези три съвета.
- Намекът IGNORE_ROW_ON_DUPKEY_INDEX се прилага само за операции INSERT с една таблица. Не се поддържа за операции UPDATE, DELETE, MERGE или многотаблици. IGNORE_ROW_ON_DUPKEY_INDEX кара оператора да игнорира нарушение на уникален ключ за определен набор от колони или за определен индекс. Когато се срещне нарушение на уникален ключ, се случва връщане назад на ниво ред и изпълнението се възобновява със следващия входен ред. Ако посочите този намек при вмъкване на данни с активирано регистриране на грешки в DML, тогава нарушението на уникалния ключ не се регистрира и не води до прекратяване на израза.
Семантичният ефект на този намек води до съобщения за грешка, ако са нарушени конкретни правила:
- Ако посочите индекс, тогава индексът трябва да съществува и да е уникален. В противен случай изявлението причинява ORA-38913.
- Трябва да посочите точно един индекс. Ако не посочите индекс, тогава изразът причинява ORA-38912. Ако посочите повече от един индекс, тогава изразът причинява ORA-38915.
- Можете да посочите или CHANGE_DUPKEY_ERROR_INDEX, или IGNORE_ROW_ON_DUPKEY_INDEX намек в израз INSERT, но не и двете. Ако посочите и двете, тогава изразът причинява ORA-38915.
- Както при всички подсказки, синтактична грешка в намекната кара да бъде игнориран тихо. Резултатът ще бъде, че ORA-00001 ще бъде причинен, точно както ако не беше използван намек.
insert /*+ ignore_row_on_dupkey_index(unique_table, unique_table_idx) */ into unique_table (select * from non_unique_table);
Сродни статии
ORA-00911:невалиден знак
ORA-03113:край на файла на комуникационен канал
ORA-00257
ORA-29285:грешка при запис на файл
ORA-29913 с външни таблици
изтрийте заявка в oracle
https://docs.oracle.com/cd/E11882_01/server.112/e17766/e0.htm