выдает ORA-00001: нарушено уникальное ограничение в INSERT / UPDATE - PullRequest
6 голосов
/ 13 марта 2012

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

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

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

Ответы [ 4 ]

11 голосов
/ 13 марта 2012

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

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, с данными, уже имеющимися в таблице, чтобы определить причину нарушения ограничения.

4 голосов
/ 27 июля 2013

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

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

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

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

3 голосов
/ 13 марта 2012

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

ORA-00001: unique constraint (TABLE_UK1) violated

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

0 голосов
/ 09 января 2019

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

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

Затем используйте запрос Джастина Кейва (вставленный ниже), чтобы найтивсе столбцы, используемые в 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;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...