Как я могу удалить из трех таблиц с внешними ключами? - PullRequest
3 голосов
/ 02 марта 2010

Я хочу иметь возможность выбрать groupID и выполнить каскадное удаление через три таблицы, которые находятся в базе данных сервера MS SQL. Таблицы выглядят следующим образом:

table 1 - GROUP
-------------------------------------------
groupID | description | etc


table 2 - MEMBER
-------------------------------------------
memberID | name | etc


table 3 - MAPPINGTABLE 
-------------------------------------------
mappingID | groupID | memberID

Я думаю, что, поскольку я знаю groupID, я мог бы, вероятно, выбрать memberID из таблицы сопоставления на основе groupID и удалить их из таблицы member, но обычно я получаю ошибку:

"Оператор DELETE конфликтовал с ограничением REFERENCE ... [ограничение FK в таблице]".

Может ли кто-нибудь дать мне несколько советов о том, как лучше всего удалить все три эти таблицы одновременно?

Спасибо.

Ответы [ 5 ]

5 голосов
/ 02 марта 2010

Вы сталкиваетесь с Ссылочная целостность . Не беспокойся, RI твой друг. Он предназначен для защиты вас.

Исходя из вашей структуры, вы не можете удалить из таблицы Member или Group , если строка, которую вы пытаетесь удалить, имеет соответствующую строку в MappingTable .

Если бы система позволила вам это сделать, вы бы имели бесхозные данные в MappingTable без соответствующих данных в таблицах участников или групп. База данных не позволяет вам удалить данные, так как на данные наложено ограничение ссылочной целостности с использованием ограничения внешнего ключа.

Существуют варианты, такие как ON DELETE CASCADE, но они потенциально очень опасны и могут привести к огромной потере данных. Лично я никогда не применяю каскадные удаления.

Сначала необходимо удалить строки из MappingTable , а затем удалить любые данные из справочных таблиц (элемент, группа)

Сказав это, я должен сказать следующее:

  1. Сделайте резервные копии (и убедитесь, что у вас есть действительная резервная копия) ваших данных перед их удалением.
  2. Сделайте еще одну резервную копию, потому что удаленные данные исчезли навсегда.
  3. Свяжитесь с предприятием / МСП, чтобы подтвердить, что вы поступаете правильно, удалив данные
3 голосов
/ 02 марта 2010

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

1 голос
/ 02 марта 2010

для использования каскадного удаления необходимо указать правило удаления во внешнем ключе. опция "ON DELETE CASCADE" - это то, что вам нужно.

см. Этот пример

CREATE TABLE table_child
(
fieldkeyparent int,
field1 INT,
FOREIGN KEY ([fieldkeyparent]) REFERENCES Table_parent
ON DELETE CASCADE)

проверьте эту ссылку для SQL Server. Каскадные ограничения ссылочной целостности

0 голосов
/ 02 марта 2010

Самое простое, когда вы настраиваете свои внешние ключи, вы устанавливаете их на ON DELETE CASCADE

ALTER TABLE mappingtable ADD CONSTRAINT fk_group_id FOREIGN KEY(groupID) REFERENCES group(groupID) ON DELETE CASCADE

Другой вариант - ON UPDATE CASCADE, если вы хотите добавить его, но здесь это не поможет.

Это делает так, что при удалении родителя из GROUP он автоматически удаляет любую ссылку на него в таблице MAPPINGTABLE

Чтобы также удалить пользователей, вам нужно будет сделать второй оператор удаления.

0 голосов
/ 02 марта 2010

Каскадные удаления по-разному реализованы на разных серверах SQL. Что вы используете для серверного программного обеспечения?

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

ALTER TABLE MAPPINGTABLE ADD CONSTRAINT FK_GROUPID
    FOREIGN KEY (groupID) REFERENCES GROUP(groupID)
ON DELETE CASCADE
;
...