web-dev-qa-db-ja.com

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

特定のテーブルにデータを保存するためにRubyでdatamapperを使用しています。

いくつかのテーブルには非常に大量の情報があり、ユーザーが「データベースを再構築する」ときに基本的に消去します(基本的にすべてを削除し、データを再計算します)。

私はもともとForum.all.destroyを試し、すべての異なるテーブルでそれを行いましたが、phpmyadmin内から削除されていないものがあることに気付きました。外部キーのためにしか想像できません。前もってキーを持っている他のテーブルが正常に削除されたので、私は本当に知りませんが。言うまでもありませんが、idは単に「ゼロ」にするだけなので、キーは非常に大きな数字(キー#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
39
Tallboy

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

次のプラン:

最初に子テーブルを切り捨ててから、親テーブルを切り捨てる必要があります。

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

96
Devart

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

以下のコードを使用できます。

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から増やします

14
Phoenix