2017-06-28 4 views
1

私は2つのテーブルを持っています:メッセージと製品。 メッセージテーブルには、ProductテーブルのProductIdと同じsourceidがあります。phpmyadminの外部キー制約に条件を追加することは可能ですか?

製品には製品ID(productID)が与えられ、ユーザーは製品に関する売り手にメッセージを送ることができます。これらのメッセージの場合、特定の製品に関連している場合、sourceidが与えられています。これは基本的に製品IDです。メッセージが商品に関連していない場合、ソースIDは0に設定されます。

販売者が商品を削除するたびに、関連するすべてのメッセージが削除されるたびに、メッセージエントリを削除するように外部キー制約を設定できます。

しかし、sourceidが0に設定された製品に関連しないすべてのメッセージがデータベースに保存されていないことがわかりました。明らかに、productid = 0のプロダクトが存在せず、外部キー制約がメッセージ項目(sourceid = 0)を直ちに削除するためです。

phpmyadminに条件を設定する方法はありますか?外部キー制約がsourceid> 0のときにのみ実行される場合、それを設定できれば、システムはうまくいくはずです。しかし、私はこの条件を設定する方法や、phpmyadminがこの条件を設定できるかどうかはわかりません。

助けてください。どうもありがとうございます。

答えて

0

あなたはON DELETE CASCADEを使用して、外部キーとMessageテーブルを定義することができます

CREATE TABLE Message (
    messageid INT(11) NOT NULL AUTO_INCREMENT, 
    message VARCHAR(255) NOT NULL, 
    -- other columns 
    sourceid INT(11) NOT NULL, 
    PRIMARY KEY (messageid), 
    FOREIGN KEY (sourceid) REFERENCES Product(ProductId) ON DELETE CASCADE 
) ENGINE=InnoDB; 

あなたは、テーブル全体を再定義したくない場合は、次のALTER TABLE文を使用することができます

ALTER TABLE Message 
ADD CONSTRAINT fk_pid 
FOREIGN KEY (sourceid) 
REFERENCES Product (ProductId) 
ON DELETE CASCADE 

この変更を適用すると、Productテーブルから製品レコードを削除すると、対応するすべてのメッセージがMessageにも削除されます。

+0

だから私はnullにソースIDを設定するだけです0の代わりに製品に関連しないメッセージを参照するときはいつでも? – Kevin

+0

@Kevinあなたが念頭に置いていることは分かりませんが、Bill Karwinの答えによると、 'ProductId'を' NULL'に設定し、そのレコードを削除すると、対応するメッセージのカスケード削除を無視する必要があります。 –

2

はい、外部キーが一部のメッセージに関連しない場合は、product_id外部キー列をNULL可能にします。任意の製品を参照したくない場合は、0の代わりにNULLを格納します。外部キー参照の目的でNULLは無視されます。

これは事実上、私は答えたこれらの過去の質問と同じです:

+0

製品に関係のないメッセージを参照するときはいつでも、sourceidを0ではなくnullに設定するだけです。 – Kevin

+0

事実上同じであれば、この質問を重複として閉じることができます。私はOPが実際に複数のものを求めていると思う。何らかの理由で、私は 'ON CASCADE DELETE'について回答しました:-) –

+0

回避策の別の方法を考えていましたが、製品が削除されたときに関連するメッセージエントリがsourceidを0に更新するというphpmyadminを設定できますか? – Kevin

関連する問題