2013-04-16 12 views
5

私はredbean ORMを使ってmysqlとcodeigniterを使っています。私が実行したとき、多くのassosciationに多くの外部キーを実装した後、私は次のエラーを得た:外部キーにリンクされたテーブルをテストするにはどうすればよいですか?

drop TABLE IF EXISTS `temp` 

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

私はその後、phpmyadminのにSHOW ENGINE INNODB STATUSを入力します。出力には次のものが含まれます。

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` 

を、私はまだ上記のエラーを取得しています、とdropコマンドは動作しません。私が試してみました。また:

truncate TABLE `temp`, `temp_workers` 

ができます:

You have an error in your SQL syntax 
+0

なぜ、「TRUNCATE」しませんか? – zerkms

+0

質問への編集を参照してください – user61629

+2

temp_workersを削除/切り捨ててください。一時テーブルのFK制約があります。 –

答えて

2

を最初に、他のテーブルにFKのcontraintsを持つ任意のテーブルを削除する必要がコメントで述べたように、あなたはにリンクされたテーブルをドロップすることができます。

例:一のユーザの行が一つのアドレス行を参照することができる1関係(more on data normalization)、及びアドレス列は、ユーザの行の存在に依存するので、:

User 
    id: 1 
    name: Mike 

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

このセットアップは1でありますユーザー行を削除しようとすると、あなたが言及したエラーが表示されます。

ただし、アドレステーブルを最初に削除すると、Userテーブルが他のテーブルとFKでないため、すべてが正常に機能します。

スキーマ内に確実に孤立した行がないようにして、データ駆動型アプリケーション全体に浸透します。

また、次のコマンドを発行します。

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

をしかし、私は強く、あなたのデータの参照整合性を壊す可能性があるので、これに対する助言、そして本当の混乱に終わるでしょう。私は誰かがエンタープライズ環境でこれを行うのを見てきました。それを取り除くのに数週間かかりました。ただし、これを行う場合STRICTLYをテスト目的で使用します。ユニットテストを書く、あるいは単に学習、そしてあなたは、テーブルを毎回落としたくなかったように、あなたがこれを行うことができます:外部キー制約を使用して

# 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; 

適切なスキーマ設計はのための良い基盤を構築することに道に沿って行きますあらゆるデータ駆動アプリケーション。使用するタイミングと外来のキー制約を構築する方法については、時間がかかりますが、時間の経過とともに理解し始めます。開始するには、magento,wordpress、またはvbulletinのようなオープンソースプロジェクトをダウンロードし、そのスキーマを見てみましょう。 MySQL workbenchを使用してこれらのスキーマをイントロスペクションし、Entity-Relationship Diagrams(ERD)を表示することもできます。これにより、表間のリンクが視覚的に示されます。

+0

ありがとう、すばらしい答え! – user61629

関連する問題