2011-12-27 2 views
25

Я использую 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 

ответ

82

План А:

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. 

Plan B:

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

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

+0

любая идея, как это сделать в рубине? Я попытался запустить каждую команду отдельно в приложении и ничего не удалял. Затем я попытался запустить их по очереди в phpmyadmin по порядку, и он по-прежнему говорит # 1701 - Не удается обрезать таблицу, на которую ссылается ограничение внешнего ключа – Tallboy

+1

. он работал ... он был только там за миллисекунду, прежде чем он снова добавил мои данные, и я не поймал его на самом деле усечением. благодаря! – Tallboy

+1

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

9

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

Вы можете использовать приведенный ниже код.

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; 

Это будет просто удалить все строки и сделать приращение ID от 1 года.

Смежные вопросы