Как удалить все строки таблицы с рекурсивной структурой (MySQL)? - PullRequest
5 голосов
/ 21 декабря 2010

У меня есть таблица в моей БД, в которой у каждой строки есть родительский идентификатор, который является идентификатором другой строки в таблице (таблица представляет древовидную структуру).Я хотел бы очистить стол.Но когда я выполняю

DELETE FROM table_name WHERE true;

, я получаю сообщение об ошибке (ограничение внешнего ключа).Как мне очистить таблицу?

Уточнение: я хочу удалить все содержимое таблицы, а не сами таблицы.

Ответы [ 5 ]

4 голосов
/ 21 декабря 2010

Когда вы создаете отношения с внешним ключом, вам нужно указать on delete cascade.

РЕДАКТИРОВАТЬ: Здесь есть довольно хорошая ссылка: http://en.wikipedia.org/wiki/Foreign_key

1 голос
/ 21 декабря 2010

Если вы не можете изменить поведение ON DELETE, вы можете делать это несколько раз, пока таблица не станет пустой:

DELETE FROM table_name WHERE id NOT IN (SELECT parent_id FROM table_name)
1 голос
/ 21 декабря 2010

Это должно сработать:

TRUNCATE table_name;
0 голосов
/ 17 июля 2015

Старая ветка, но я опубликую свой ответ только для того, чтобы помочь любому, кто читает этот вопрос.

У меня возникла та же проблема, и в итоге я установил для родительского столбца значение NULL перед выполнением оператора delete.

UPDATE table_name SET parent_id=null WHERE true;

DELETE FROM table_name WHERE true;
0 голосов
/ 21 декабря 2010

Сначала удалите строки, которые не имеют дочерних элементов.

Поэтому, если внешний ключ идентификатора равен parent_id, сделайте что-то вроде:

DELETE FROM table_name WHERE parent_id IS NOT NULL;

Затем удалите остальные:

DELETE FROM table_name;
...