2011-02-10 7 views
11

2つの列に対してUNIQUE INDEX制約を作成しようとしていますが、別の列に値1が含まれている場合のみです。たとえば、column_1column_2は、active = 1active = 0を含む行は、activeの他の行の値に関係なく、column_1column_2の値を別の行と共有できます。しかし、active = 1の行は、column_1またはcolumn_2の値と、active = 1の値を共有できません。UNIQUE制約には、フィールドに特定の値が含まれている場合のみ

「共有」とは、同じ列に同じ値を持つ2つの行を意味します。例:row1.a = row2.a AND row1.b = row2.b. row1の両方の列がrow2の他の2つの列と一致する場合にのみ、値が共有されます。

私は自分自身を明確にしたいと思います。 :\

答えて

0

索引は外部の影響には左右されません。この種の制約は、データベース外で実装する必要があります。

0

これはチェック制約で実現できますが、MySQLが類似のものをサポートしているかどうかはわかりません。

データベース上で動作するものは、テーブルを2つに分割できます。もしactive = 0のレコードがヒストリレコードだけで、再びアクティブにならない場合は、それらを別のテーブルに移動し、元のテーブルに単純なユニーク制約を設定するだけです。

+0

IRCで同様の提案がありました。アクティブな表と非アクティブな表を作成します。しかし、あなたがそれを置く方法はより意味があります。歴史的なテーブルとアクティブなテーブルがあります。しかし、このテーブルには多くのフィールドがあり、これらのフィールドを2つのテーブルに複製するのは間違っているようです。私はこのタイプの冗長性を避けるよう提案しますか? – Sam

+0

少しの非正規化は長い道のりになる可能性があるので、重複する定義について心配しないでください。もちろん、元のテーブルを履歴テーブルにも変更する必要があります。そのためオーバーヘッドはありますが、IMHOではクリーンなデータの価値があります。 – SWeko

+0

ええと、一意の索引付けが必要なデータだけを分離するとどうなりますか?テーブル:mydata、mydata_active、mydata_inactive。このようにして、mydataには主キーとデータ列が含まれます。また、mydata_activeおよびmydata_inactiveには、一意に索引付けする必要がある列と、mydataを参照する外部キーのみが含まれます。これはもう1つの方法ですが、余分な(3番目の)テーブルが必要です。 – Sam

11

column_1、column_2、およびactiveを使用して複数列UNIQUE索引を作成し、一意性が不要な行に対してactive = NULLを設定できます。代わりに、(see MySQL trigger syntax) トリガーを使用して、その値がすでにテーブルに入っている場合は挿入/更新された各行を調べることができますが、それはむしろ遅いと思います。

+0

私はNULL解決策をお勧めしたいと思います。それは簡単です。NULLのソートはFALSEです(基本的なSQLerには言わないでください)。 –

+0

NULL解決法では、データベースが2行の一意性を状況が同じである場合にどのように区別しますか? mysqlはその時の制約チェックを避けますか? –

2

私は2つの列にUNIQUE INDEX制約を作成しようとしていますが、別の列に値が含まれている場合にのみ1

あなたが一意の値に「別の列」の値を設定することができます例えばレコードのidのように1に等しくない。

次に、「別の列」を含む3つの列すべてに一意索引制約を適用できます。 「別の列」columnXとしましょう。 一意の制約をレコードに適用する場合は、columnXの値を1に設定します。一意制約を適用しない場合は、columnXの値を一意の値に設定します。

追加の作業/トリガは必要ありません。 3つの列すべてに対するユニークなインデックスが問題を解決する可能性があります。

関連する問題