2012-03-20 15 views
0

マイテーブルスキーマの最大のものである:SQL:制約の少なくとも一つを強制&&各キー

r(int aID not null, int bID not null, bool main) 

主キー(AID、BID)。 aIDとbIDはどちらも外部キーです(異なる表を参照しています)。

私はすべてのaIDに対して常にmain = trueの1つと1つのbIDしかないことを強制したいと思います。

どのようにすればDBレベルで行うことができますか? constraint unique (aID, main)を追加して「最大1」を適用することができます。また、mainはtrueまたはNULLのいずれかです。

"少なくとも1"の部分はどうですか?

PS:MySQLでの作業

編集:解説のためのデータの例: aIDとbIDのさまざまな組み合わせを使用できますが、各aIDでは1つの組み合わせだけでもmain = trueとなります。 デモデータ:

1, 2, true 
1, 3, NULL 
1, 4, NULL 
1, 5, true <- wrong, only one main=true 
... 

答えて

0

トリガーを2つ作成する必要があります。どちらもそれぞれの行に適用されます。最初は挿入前に適用され、2番目は更新前に適用されます。 main = trueであり、同じaIDのnew.aIDを持つが、bIDが異なる、またmain = trueの表に少なくとも1つの他の行がある場合は、new.main = falseを設定します。

ほとんどのRDBMSでは単一のトリガーでこれを行うことができますが、MySQLは挿入と更新の両方に該当するトリガーを(私が間違っていなければ)サポートしていません。

+0

おそらく私はそれを正しく説明しなかった、更新された元の記事を見てください。ありがとうございました! –

+0

私は自分の答えを編集します、その2番目のバージョンがもっと役立つでしょう、少なくとも私はそう望みます。 –

関連する問題