Каков наилучший способ очистить самореферентную таблицу MySQL? - PullRequest
17 голосов
/ 05 марта 2009

У меня есть самоссылочная таблица MySQL с рекурсивным parent_id:

CREATE TABLE `recursive` (
  `id` int(11) NOT NULL auto_increment,
  `parent_id` int(11) default NULL,
  `name` varchar(100) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `data_categorysource_parent_id` (`parent_id`),
  CONSTRAINT `parent_id_refs_id_627b4293`
    FOREIGN KEY (`parent_id`) REFERENCES `data_categorysource` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Во время тестирования я хочу очистить его, но TRUNCATE не удается:

TRUNCATE `recursive` 
/* SQL Error: Cannot delete or update a parent row: a foreign key
constraint fails...

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

Есть ли простой способ обойти это? Я не могу DROP таблицу и легко воссоздать ее, так как другие таблицы ссылаются на нее (я уже обрезал ее, поэтому там не должно быть проблем с целостностью данных).

Ответы [ 6 ]

26 голосов
/ 05 марта 2009

Почему бы и нет:

UPDATE 'recursive' SET 'parent_id' = NULL WHERE 'parent_id' IS NOT NULL;
DELETE FROM 'recursive';

17 голосов
/ 05 марта 2009

Если вы просто хотите очистить все для тестирования, используйте:

SET FOREIGN_KEY_CHECKS = 0;

// Execute Query

SET FOREIGN_KEY_CHECKS = 1;

Это полностью обходит любые проверки внешнего ключа.

1 голос
/ 05 марта 2009

Ну, вы можете добавить ON DELETE CASCADE к определению FOREIGN KEY ... хотя бы временно. Это позволит вам обрезать таблицу, удалив сначала указанные строки.

Существуют и другие типы ON DELETE; по умолчанию ON DELETE NO ACTION.

0 голосов
/ 19 декабря 2013

удалить из таблицы_1, где дата (table_1_TIME) <(выберите T.t_Date из (выберите max (дата (table_1_TIME)) как t_Date из таблицы_1) как T) </p>

0 голосов
/ 05 марта 2009

Или просто удалите (рекурсивное) ограничение внешнего ключа, затем обрежьте таблицу, затем повторно добавьте ограничение.

0 голосов
/ 05 марта 2009

Повторно выбирайте строки, которые не отображаются как родительские, и удаляйте их, пока таблица не станет пустой. (Предполагая, что циклов нет ...)

...