テーブルを適切に切り捨てるにはどうしたらよいですか?

私はrubyでdatamapperを使用して、あるテーブルにデータを格納しています。

いくつかのテーブルは非常に大量の情報を持っており、ユーザーが 'ribilds database' (基本的にすべてを削除し、データを再計算します)したときにそれらを消去したいのです。

私はもともとForum.all.destroyを試して、すべての異なるテーブルに対してそれをやりましたが、それらのいくつかはphpmyadminの中から削除されないことに気づきました。しかし、私は本当に知らないので、私の他のテーブルの外部キーは正常に削除されました。もちろん、私はむしろ 'zero' キーが非常に大きな数字(キー#500,000のような)にならないように、とにかくそれを削除します。

次に、以下のコードで実行してみましたが、 '外部キー制約'のためにテーブルがクリアされません。私は、互いに依存しているすべてのテーブルを消去している事実を知っているので、それを強制的に動作させたいと思います(私は、2つのテーブル、設定テーブルとランダムストレージテーブルだけを消去していません、どちらも外部キーは使用していません)。

今のところ、私は...

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

それはmysqlの構文がどうやら間違っていることを除けば大丈夫でしょう。

phpmyadminで1つずつやってみたら、こうなりました。

Cannot truncate a table referenced in a foreign key constraint
ソリューション

プラン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

まず子テーブルを切り捨て、次に親テーブルを切り捨てます。

外部キーチェックを無効にすると、制約に従わない行がテーブルに入力され、未定義の動作を引き起こす可能性があります。

解説 (3)

代わりに、外部キーチェックを無効にする.を使用します。

以下のコードを使用することができます。

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以降に増加するようにします

解説 (0)