MySQL удаляет несколько столбцов из двух таблиц - PullRequest
0 голосов
/ 18 ноября 2009

У меня есть две таблицы, подобные этой:

Table categories:
columns: id, name, parent
1, Foods, 0
2, Drinks, 0
3, FastFood, 1
4, Hamburger, 3

Table documents:
columns: id, name, categoryID
1, CheseBurger, 4
2, shop, 3

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

Как я могу это сделать?

Ответы [ 4 ]

1 голос
/ 18 ноября 2009

Как упоминалось ранее, вы можете использовать ИНОСТРАННЫЕ КЛЮЧЕВЫЕ ОГРАНИЧЕНИЯ для выполнения такой задачи. Ниже будет ваша новая структура таблиц для MySQL для поддержки автоматического удаления как документов, так и дочерних категорий:

CREATE TABLE categories (
   id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
   name VARCHAR(30) NOT NULL,
   parent INT(11) UNSIGNED,
   INDEX(parent),
   FOREIGN KEY (parent) REFERENCES categories(id) ON DELETE CASCADE       
) engine=InnoDB;

CREATE TABLE documents (
   id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
   name VARCHAR(30) NOT NULL,
   categoryID INT(11) UNSIGNED NOT NULL,
   INDEX(categoryID),
   FOREIGN KEY (categoryID) REFERENCES categories(id) ON DELETE CASCADE
) engine=InnoDB;
0 голосов
/ 18 ноября 2009

Некоторые базы данных поддерживают принудительную ссылочную целостность через внешние ключи. Я сделал это с Oracle, но я не эксперт MySQL. Это делается как атрибут внешнего ключа через ключевое слово «CASCADE DELETE». База данных автоматически обрабатывает это для вас.

Вот краткий пример Oracle:

ALTER TABLE Things ADD CONSTRAINT FK_Things_Stuff
    FOREIGN KEY (ThingID) REFERENCES Stuff (ThingID)
ON DELETE CASCADE
;
0 голосов
/ 18 ноября 2009

У вас есть 2 варианта - в любом случае я рекомендую вам создать ограничения внешнего ключа для ваших отношений.

Вариант 1 - использовать ON DELETE CASCADE . Я думаю, что это не очень хорошая практика, потому что непреднамеренное удаление может иметь довольно неожиданные последствия.

Вариант 2 - пройтись по дереву и найти записи, которые необходимо удалить. Вы можете использовать самосоединение для своей таблицы категорий, чтобы идентифицировать всех дочерних элементов на n уровнях иерархии. Это предпочтительный подход, имо.

Другие идеи, такие как триггеры, являются всего лишь вариацией 2.

0 голосов
/ 18 ноября 2009

Я бы либо использовал триггер, либо создал бы более детальный sproc "delete", который бы его обрабатывал.

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