Как правильно обрезать таблицы?
Я использую 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
Ответы
Ответ 1
План 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:
Вы должны сначала обрезать дочерние таблицы, а затем родительские таблицы.
Отключение внешнего ключа проверяет риски ввода строк в ваши таблицы, которые не соответствуют ограничениям, которые могут вызывать поведение undefined.
Ответ 2
Вместо использования Отключить проверку внешнего ключа.
Вы можете использовать приведенный ниже код.
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 до.