2012-01-10 6 views
2

私はデータベースプログラミングをより良くしようとしているので、外来キーを与えることを示唆されてきました。問題は、jobsテーブル内のジョブが削除された場合、それに関連する孤立したメッセージがメッセージテーブルに残っていたことです。だから外来の鍵が私に解決策になるように導入されました。初めての外来キーの経験、どうしたのですか?

しかし、私はこれをやろうとしたときにこれを得ました。そして、それが何を言っているのかわかりません。さらに、仕事から仕事への制約をどのように設定するべきかもわかりませんメッセージ、またはその逆。 :(

がここにエラーがあります:。

#1452 - Cannot add or update a child row: a foreign key constraint fails  (`nzua9c8_tasks`.<result 2 when explaining filename '#sql-2929_701930'>, CONSTRAINT `#sql-2929_701930_ibfk_1` FOREIGN KEY (`id`) REFERENCES `jobs` (`id`) ON UPDATE NO ACTION) 

また、PHPMyAdminのためのインターフェイスは、私は削除するオプションを持っていなかった私は、タスクを削除すると、メッセージIDが「制限」されることを示唆しました。私は仕事のテーブルのidと一致する「JOB_ID」とのいずれかのメッセージがあまりにも削除することにしたい。提供任意の助け

感謝を。

答えて

2

あなたはあなたの外部キー定義にon delete cascadeを追加したい(直後on update no actionあなたのスクリプトで)。

だから、のようになります。

alter table messages add foreign key (id) references jobs (id) on delete cascade 

詳細はhereを見つけることができます。

+0

こんにちは、Eric。応答のおかげで、私はあなたのコメントに基づいて別の何かを試しました、今私はこのエラー、かなり似ています:ALTER TABLE 'messages'外部キーを追加(' job_id')REFERENCES 'nzua9c8_tasks'。'jobs'( ' id' )更新時にCASCADEを削除します。 –

+0

ジョブテーブルにジョブを追加できるようにするには、自動インクリメントIDが与えられます。メッセージがメッセージテーブルに追加されると、自動インクリメントIDも持ちますが、接続されますジョブはjob_idフィールドで指定します。ジョブを削除すると、関連するすべてのメッセージも削除されることを願っています。私は何が欠けていますか?ありがとう。 –

0

1つのジョブに複数のメッセージ(1:N関係)が含まれている場合、メッセージテーブルにはジョブテーブルの外部キーが必要です。

エラーメッセージは基本的に、外部制約によって参照するものがあるときに行を更新/削除できないことを示しています。だから、

テーブルジョブがレコードを持っている場合:

メッセージの
id name 
1 job1 
2 job2 

とテーブルのレコード

id name job_id 
1 mes1 1 
2 mes2 2 

を持って次に、あなただけの最初のテーブルからレコードをドロップ傾けます。最初にメッセージテーブルのレコードを参照して更新する必要があります。

また、依存するレコードが自動的に破棄または更新されるように外部キーポリシーを変更することもできます。

0

対応する「制約」を持つ外部キーは、「参照整合性」を保証するためのものであり、言及した「ダングリングリファレンス」問題を解決します。

外部キーに「欠点」は、データが正しい順序でデータベースに取り込まなければならないことである。

テーブル「A」の行は、テーブル内の1つまたは複数の行への外部キーのポインタが含まれている場合"B"の場合、テーブル "A"の行を作成する前にテーブル "B"の行を作成する必要があります。そうしないと、制約がエラーをスローします。

関連する問題