У меня есть MySQL таблицы «папки»:Как рекурсивно удалять элементы из таблицы?
CREATE TABLE IF NOT EXISTS `folders` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`folder_key` varchar(40) NOT NULL,
`parent_key` varchar(40) NOT NULL,
`name` varchar(16) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
Я не использовать целочисленные идентификаторы, только ключи (буквенно-цифровые хэши, которые я замещаются словами, чтобы сделать вещи более ясно). Таким образом, folder_key
& parent_key
Хеши SHA-1 (в моем реальном приложении).
INSERT INTO `folders` (`id`, `folder_key`, `parent_key`, `name`) VALUES
(1, 'sun', 'root', '1'),
(2, 'moon', 'sun', '1.1'),
(3, 'jupiter', 'moon', '1.1.1'),
(4, 'mars', 'root', '2');
Как вы видите, первый элемент имеет также родительскую клавишу, это корневой ключ.
Тестовый пример: Если я хочу, чтобы удалить элемент с folder_key
=== moon
(1.1), она должна также удалить его детей элемент (ы), в данном случае это элемент с folder_key
=== jupiter
(1.1.1) и так далее ...
Пусть говорят, что я хочу, чтобы удалить несколько элементов, так что я:
DELETE from folders WHERE folder_key IN('moon', 'mars');
После выполнения, таблица должна иметь только один элемент с folder_key
=== sun
Итак, вопрос в том, что: Как удалить элементы из этой таблицы, имеющие одну или несколько folder_keys (рекурсивно) с помощью триггеров MySQL, ON DELETE CASCADE или ...?
Спасибо.
mazzucci, ваш запрос не работает для меня (MySQL 5.5.9). – KenT
Какая ошибка? Плохой синтаксис или у вас есть значения, которые не совпадают? Я вижу, что 'parent_key' NOT NULL? Вы должны сделать это NULL для корневых папок, не так ли? –
большое спасибо. Я решил свою проблему, изменив модель. – KenT