issue ORA-00001: нарушено уникальное ограничение, входящее в INSERT/UPDATE

Вопрос: Я пытаюсь вставить некоторые значения в таблицу через приложение и получить проблему ORA-00001: уникальное ограничение нарушено. Я вижу, что последовательности не синхронизированы с самым высоким идентификатором таблицы, но даже после исправления порядкового номера ошибка по-прежнему сохраняется. Как я могу отлаживать эту ошибку больше, делает ли журналы оракула больше ошибок? как я могу видеть журналы

Вопрос:

Я пытаюсь вставить некоторые значения в таблицу через приложение и получить проблему ORA-00001: уникальное ограничение нарушено. Я вижу, что последовательности не синхронизированы с самым высоким идентификатором таблицы, но даже после исправления порядкового номера ошибка по-прежнему сохраняется. Как я могу отлаживать эту ошибку больше, делает ли журналы оракула больше ошибок? как я могу видеть журналы оракулов? Спасибо Priyank

update: мы используем плагин аудита аудита, а в классе домена для пользователя мы ловим событие сохранения и регистрируем запись в журнале аудита

Итак, в классе User мы делаем:

class User { //some attributes, constraints, mappings def onSave = { Graaudit aInstance = new Graaudit(); aInstance.eventType= «GRA User Create» aInstance.eventDescription = «GRA User Created» aInstance.objectid = username aInstance.objecttype = ‘GRAUSER’ aInstance.user_id = RequestContextHolder.currentRequestAttributes().session.username aInstance.withTransaction{ aInstance.save() } } }

Если у нас нет вышеуказанного кода в событии onSave, пользователь будет создан успешно.
Я предполагаю, что он связан с транзакцией hibernate, которую мы используем на aInstance, который умирает или текущая транзакция умирает из-за этого сохранения.
Если мы не используем транзакцию, получаем исключение «org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here» Не знаю, как исправить эту проблему.. Спасибо

Ответ №1

Сообщение об ошибке будет содержать имя ограничения, которое было нарушено (может быть более одного единственного ограничения в таблице). Вы можете использовать это имя ограничения для идентификации столбцов (столбцов), в которых объявляется уникальное ограничение

SELECT column_name, position FROM all_cons_columns WHERE constraint_name = <<name of constraint from the error message>> AND owner = <<owner of the table>> AND table_name = <<name of the table>>

Как только вы узнаете, какие столбцы (столбцы) затронуты, вы можете сравнить данные, которые вы пытаетесь использовать INSERT или UPDATE отношении данных, уже находящихся в таблице, чтобы определить, почему нарушается ограничение.

Ответ №2

Эта ошибка ORA возникает из-за нарушения уникального ограничения.

ORA-00001: уникальное ограничение (constraint_name) нарушено

Это вызвано попыткой выполнить инструкцию INSERT или UPDATE, которая создала дублирующее значение в поле, ограниченном уникальным индексом.

Вы можете решить это либо путем изменения ограничения, чтобы разрешить дубликаты, либо удалить уникальное ограничение, либо вы можете изменить свой SQL, чтобы избежать дублирования вставок.

Ответ №3

Сообщение об ошибке Oracle должно быть несколько дольше. Обычно это выглядит так:

ORA-00001: unique constraint (TABLE_UK1) violated

Имя в круглых скобках – это имя прохода. Он сообщает вам, какое ограничение было нарушено.

Ответ №4

Сообщение об ошибке выглядит следующим образом

Error message => ORA-00001: unique constraint (schema.unique_constraint_name) violated

ORA-00001 происходит, когда: “запрос пытается вставить” дублирующую “строку в таблицу”. Это накладывает уникальное ограничение на неудачу, следовательно, запрос не выполняется, и строка НЕ добавляется в таблицу. “

Решение:

Найти все столбцы, используемые в unique_constraint, например, столбец a, столбец b, столбец c, столбец d совместно создают unique_constraint, а затем найти запись из исходных данных, которая является дубликатом, используя следующие запросы:

— to find <<owner of the table>> and <<name of the table>> for unique_constraint select * from DBA_CONSTRAINTS where CONSTRAINT_NAME = ‘<unique_constraint_name>’;

Затем используйте запрос Justin Cave (вставленный ниже), чтобы найти все столбцы, используемые в unique_constraint:

SELECT column_name, position FROM all_cons_columns WHERE constraint_name = <<name of constraint from the error message>> AND owner = <<owner of the table>> AND table_name = <<name of the table>> — to find duplicates select column a, column b, column c, column d from table group by column a, column b, column c, column d having count (<any one column used in constraint > ) > 1;

Вы можете либо удалить эту дублирующую запись из ваших исходных данных (это был запрос на выборку в моем конкретном случае, как я испытал его с “Вставить в выборку”), либо изменить, чтобы сделать ее уникальной, или изменить ограничение.

Оцените статью
Добавить комментарий