Подтвердить что ты не робот

Каков наилучший способ для удаления таблицы с самореферентной MySQL?

У меня есть самореферентная таблица 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 таблицу и легко ее воссоздать, так как ссылаются на другие таблицы (я уже усекал их, чтобы там не было проблем с целостностью данных).

4b9b3361

Ответ 1

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

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

?

Ответ 2

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

SET FOREIGN_KEY_CHECKS = 0;

// Execute Query

SET FOREIGN_KEY_CHECKS = 1;

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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