2017-11-07 8 views
1

テーブル内の別のカラムが特定の値を持つ場合にのみ、テーブルが他のテーブルからの外部キーを受け入れるように制約を設定する必要があります。外部キーの制約を追加する方法は、テーブルFKの列の値に依存しますか?

データベースは非常に複雑ですが、私は例をあげてみましょう:

表はFoo:

Foo_id | Foo_value | Another values... 
    1 | "GOOD" | 
    2 | "BAD" | 
    3 | "GOOD" | 

テーブルバー:

Bar_id | Foo_id(FK) | Another values... 
    1 |  1  | 
    2 |  1  | 
    3 |  3  | 

あなたはバーだけはFooからIDを受け入れる受け入れるべき見ることができるようにここでFoo_Valueは「良い」です。

チェック制約を追加しようとしましたが、WHERE文を受け入れないため、Foo_Valueにアクセスできません。私は検索しようとしましたが、実際に何かを見つけることができない、または私の説明が間違っています。

答えて

1

おそらく唯一の方法は、(挿入/更新のため)triggerを使用することです:

create trigger chk_bar before insert on bar /* before update */ 
for each row 
begin 
    if not exists (SELECT 1 FROM foo 
        WHERE Foo_value = 'GOOD' AND foo_id = new.foo_id) then 
     SIGNAL SQLSTATE '45000' 
     SET MESSAGE_TEXT = 'Invalid FK'; 
    end if; 
end; 

Rextester Demo

が更新GOODfooに別のトリガーを追加することを忘れないでください - >BADまたはその意志を削除します参照整合性をチェックします。

+1

おかげで助けを求め、これは仕事を行います。 – FilipRistic

1

MySQLはCHECK制約を実装していません。

外部キーがFoo_value列を含む場合にのみ、外部キーを使用してルールを適用することができます。つまり、親テーブルに余分なKEYが必要です。

ALTER TABLE Foo ADD UNIQUE KEY (Foo_id, Foo_value); 

ALTER TABLE Bar ADD COLUMN Foo_value VARCHAR(4) DEFAULT 'GOOD', 
    ADD FOREIGN KEY (Foo_id, Foo_value) REFERENCES Foo (Foo_id, Foo_value); 

あなたはCHECK制約を使用することはできませんので、あなたがBar.Foo_valueを確保するためにトリガーを使用する必要がありますが「GOOD」である:

CREATE TRIGGER BarInsertFooValueGood BEFORE INSERT ON Bar FOR EACH ROW 
    SET Foo_value = 'GOOD'; 

CREATE TRIGGER BarUpdateFooValueGood BEFORE UPDATE ON Bar FOR EACH ROW 
    SET Foo_value = 'GOOD'; 
+0

お時間をいただきありがとうございました。 – FilipRistic

関連する問題