5

redbean ORM を使用して mysql と codeigniter を使用しています。多対多の関連付けに外部キーを実装した後、実行すると次のエラーが発生しました。

drop TABLE IF EXISTS `temp`

Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails thrown

次に、SHOW ENGINE INNODB STATUS を phpmyadmin に入力しました。出力には次が含まれます。

LATEST FOREIGN KEY ERROR------------------------:  Cannot drop table `db1`.`temp`because it is referenced by `db1`.`temp_workers`.

つまり、別のテーブルが FK を参照します。テスト目的では、関連するすべてのテーブルを削除し、テストしているコントローラーを使用してそれらを再作成するのが最善だと思います。これが最善の方法ですか?私はもう試した:

drop TABLE IF EXISTS `temp` `temp_workers`

、しかし、まだ上記のエラーが発生し、ドロップ コマンドが機能しません。また:

truncate TABLE `temp`, `temp_workers`

与えます:

You have an error in your SQL syntax
4

1 に答える 1

3

コメントで述べたように、最初に FK 制約のあるテーブルを他のテーブルにドロップする必要があり、次にリンク先のテーブルをドロップできます。

例:

User
  id: 1
  name: Mike

Address 
  id: 1
  user_id: 1 (FK constraint to User.id table.column)
  address_1: 555 Main Street

このセットアップは 1 対 1 の関係 (データの正規化の詳細) であり、1 つのユーザー行が 1 つのアドレス行を参照できます。アドレス行はユーザー行の存在に依存しているため、ユーザー行を削除しようとすると、あなたが言及したエラーが表示されます。

ただし、最初に Address テーブルを削除すると、User テーブルは他のテーブルへの FK ではないため、すべてが期待どおりに機能します。

スキーマ内の参照整合性を確保することで、データ駆動型アプリケーション全体に浸透する孤立した行が発生しないようにします。

次のコマンドを発行することもできます。

SET foreign_key_checks = 0;
# Do Stuff
SET foreign_key_checks = 1;

しかし、データの参照整合性を壊し、実際の混乱に陥る可能性があるため、これには強くお勧めしません。誰かがエンタープライズ環境でこれを行っているのを見たことがありますが、クリーンアップするのに数週間かかりました. ただし、これを厳密にテスト目的で行っている場合は、単体テストを書いたり、単に学習したりするなど、毎回テーブルを削除したくない場合は、次のようにすることができます。

# Because we remove the foreign key check, we can truncate in any order
SET foreign_key_checks = 0;
TRUNCATE TABLE user;
TRUNCATE TABLE address;
SET foreign_key_checks = 1;

外部キー制約を使用した適切なスキーマ設計は、データ駆動型アプリケーションの優れた基盤を構築するのに役立ちます。いつ使用するか、どのように外部キー制約を構築するかを理解するには時間がかかりますが、時間が経つにつれて理解し始めるでしょう。開始するには、 magentowordpress、またはvbulletinなどのオープン ソース プロジェクトをダウンロードして、それらのスキーマを確認することをお勧めします。MySQL ワークベンチを使用してこれらのスキーマをイントロスペクトし、テーブル間のリンクを視覚的に示すエンティティ関係図(ERD)を表示することもできます。

于 2013-04-17T00:51:47.973 に答える