Oracle: проблема выборочного индекса уникальности с обновлением - PullRequest
0 голосов
/ 20 июля 2011

Я создал селективный уникальный индекс

CREATE UNIQUE INDEX fn_unique_idx 
    ON table1 (CASE WHEN is_deleted='N' THEN id ELSE null END,
               CASE WHEN is_deleted='N' THEN name ELSE null END,
               CASE WHEN is_deleted='N' THEN type ELSE null END);

Так что в любой момент времени мне нужна только одна запись с is_deleted 'N' для (id, name, type).

Вставка работает нормально, т. Е. Она позволяет ввести несколько is_deleted 'Y' и генерирует уникальное константное исключение, когда я пытаюсь вставить с is_deleted = 'N', что ожидается.

Но когда я пытаюсь обновить это thowing oracle error:

ORA-00600: internal error code, arguments: [qctVCO : bfc], [1], [0], [1], [871], [1], [2], [875], [], [], [], [] 


SQL : UPDATE table1 set is_deleted = 'Y' where id = 1, name = 'foo' and type =bar';

Я хочу установить текущую запись как удаленную и вставить новую запись с обновленными данными и is_deleted = 'N'. Это в основном для поддержания истории.

Может кто-нибудь помочь мне решить эту проблему.

Спасибо.

Ответы [ 3 ]

1 голос
/ 20 июля 2011

Если я понимаю, что вы пытаетесь достичь, вы хотите иметь возможность иметь несколько строк с одинаковым (id, name, type). Для одного из этих рядов is_deleted = 'N' и для остальных из них is_deleted = 'Y'.

Это правильно?

Если так, позвольте мне предложить несколько идей:

  1. Удалите поле is_deleted. Вместо этого имейте поле version и, какой бы ни была последняя версия, это строка, которая не удаляется. Уникальное ограничение / индекс тогда естественно покрывает (id, name, type, version). Это может усложнить запрос.
  2. Введите 3 новых поля: archive_id, archive_name, archive_type. Уникальное ограничение по-прежнему распространяется на оригинал (id, name, type). Строка «удаляется», перемещая значения в archive_* поля и обнуляя исходные поля. Это должно работать, потому что кортежи, которые содержат все NULL, не включены в (уникальный) индекс.
  3. Иметь отдельную таблицу для архивных данных без единого ограничения.
  4. Может быть, использовать УНИКАЛЬНЫЙ ОДИН ИЗ УНИКАЛЬНОГО ИНДЕКСА?

Кроме того, сообщите нам, есть ли какие-либо ограничения ссылочной целостности в игре?

1 голос
/ 20 июля 2011

этот тип ошибки является внутренней ошибкой оракула - он же ошибка ...

какая версия патча у вас установлена?возможно, перейдите к текущему на всякий случай.

0 голосов
/ 20 июля 2011

Договориться с Бранко о точке № 3 . Вы также можете добавить даты START & END в эту отдельную таблицу для архивных данных.

...