Как правильно обрезать таблицы? - PullRequest
38 голосов
/ 27 декабря 2011

Я использую datamapper с ruby ​​для хранения данных в определенных таблицах.

Некоторые таблицы содержат очень большие объемы информации, и я хочу очистить их, когда пользователь «перестраивает базу данных» (в основном он удаляет все и пересчитывает данные).

Изначально я пробовал Forum.all.destroy и делал это для всех разных таблиц, но заметил, что некоторые из них просто не были удалены из phpmyadmin. Я могу только представить его из-за внешних ключей. Хотя я действительно не знаю, потому что моя другая таблица, ключи которой были успешно удалены. Не говоря уже о том, что id, в любом случае, просто «обнуляет» его, чтобы ключи не доходили до необычайно больших чисел (например, ключ № 500 000).

Затем я попытался запустить его с приведенным ниже кодом, но он не очищает таблицы из-за «ограничений внешнего ключа». Я хочу заставить его работать, потому что я точно знаю, что я очищаю все таблицы, которые зависят друг от друга (я только не очищаю 2 таблицы, таблицу настроек и таблицу случайного хранения, ни один из которых не использует внешние ключи).

Пока у меня есть ...

adapter = DataMapper.repository(:default).adapter
adapter.execute('TRUNCATE TABLE `forums`, `dates`, `remarks`');

Это было бы хорошо, за исключением того, что синтаксис mysql, по-видимому, неверен. так вот первое, что нужно

Я сделал это 1 на 1 в phpmyadmin, и когда я сделал это таким образом, он говорит

Cannot truncate a table referenced in a foreign key constraint

Ответы [ 2 ]

95 голосов
/ 27 декабря 2011

План A:

SET FOREIGN_KEY_CHECKS = 0; -- Disable foreign key checking.
TRUNCATE TABLE forums;
TRUNCATE TABLE dates;
TRUNCATE TABLE remarks;
SET FOREIGN_KEY_CHECKS = 1; -- Enable foreign key checking.

План B:

Сначала необходимо усечь дочерние таблицы, а затем родительские.

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

14 голосов
/ 14 октября 2014

Вместо использования Отключить проверку внешнего ключа.

Вы можете использовать следующий код.

DELETE FROM forums;
ALTER TABLE forums AUTO_INCREMENT = 1;

DELETE FROM dates;
ALTER TABLE dates AUTO_INCREMENT = 1;

DELETE FROM remarks;
ALTER TABLE remarks AUTO_INCREMENT = 1;

Он просто удалит все строкисделать увеличение идентификатора от 1 и далее.

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