Проблемное удаление с индексом SQL - PullRequest
0 голосов
/ 25 мая 2009

У меня есть таблица:

  • Таблица ASK с idask
  • Таблица предпочтений с idpref, fk_idask, fk_idstructure
  • таблица СТРУКТУРА с idstructure

Со всеми ограничениями между id и fk_id и уникальным индексом в таблице ПРЕДПОЧТЕНИЯ (fk_idask, fk_idstructure).

Проблема в том, что у меня есть две строки в настройках.

`IDPREF`   `FK_IDASK`   `FK_IDSTRUCTURE`  
 1          1            1  
 2          1            2

Если я хочу инвертировать (переключить?) Две структуры между предпочтениями

`IDPREF`   `FK_IDASK`   `FK_IDSTRUCTURE`  
 1          1            **2**
 2          1            **1**

Уникальный индекс между FK_IDASK и FK_IDSTRUCTURE разбивается, поскольку при первом обновлении в результате появляются два предпочтения для одного и того же запроса с одинаковой структурой.

Для предотвращения этого я делаю функцию deleteAndResave, и это решает проблему на данный момент.

Но теперь появляется таблица ASSIGNATION с idassignation и fk_idpref.

Теперь, если я удалю Предпочтение, связанное с НАЗНАЧЕНИЕМ, разрыв ограничения.

Я уже нахожу обходной путь, но безобразно. Есть какое-то вменяемое решение этой проблемы?

Спасибо за ответ!

пс. Извините за мой плохой английский: (* ​​1044 *

Ответы [ 2 ]

1 голос
/ 25 мая 2009

Вы можете попробовать это:

UPDATE
    PREFERENCES
SET
    FK_IDSTRUCTURE = 3 - FK_IDSTRUCTURE

Теперь, поскольку он выполняется за один раз, «C» (Согласованность) в «ACID» означает, что внешние ключи и уникальность обрабатываются «во время», но будут в порядке до и после.

Можно сложить оператор с помощью операторов CASE для более сложных вещей

UPDATE
    PREFERENCES
SET
    FK_IDSTRUCTURE = CASE FK_IDSTRUCTURE 
        WHEN 2 THEN 1 WHEN 1 THEN 2 ELSE FK_IDSTRUCTURE END
0 голосов
/ 25 мая 2009

Да, две структуры перевернуты между индексом таблицы и разбиением!

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

Внешний ключ должен быть в настройках и назначении ССЫЛКИ.

Другим вариантом является рассмотрение опции ON DELETE CASCADE для внешнего ключа. Это означает, что при удалении строк в ссылочной таблице ядро ​​базы данных автоматически удаляет соответствующие строки в таблице внешнего ключа.

Другим часто используемым вариантом является сохранение строк, но пометка их как неактивных. Это можно сделать, добавив столбец «активный бит». При запросе вы отфильтровываете строки, помеченные как неактивные.

...