複数のフィールドによるMySQL一意のインデックス
-
12-10-2019 - |
質問
DBには、その変更の歴史を保存する特別なテーブルがあります。いわゆる「自己アーカイブ」テーブル:
CREAT TABLE coverages (
id INT, # primary key, auto-increment
subscriber_id INT,
current CHAR, # - could be "C" or "H".
record_version INT,
# etc.
);
加入者の「カバレッジ」を保存します。フィールド「現在」は、これが現在/元のレコード(「C」)または履歴レコード(「H」)であるかどうかを示します。
指定されたサブスクライバーの現在の「c」カバレッジは1つしかありませんでしたが、2つのフィールド(*subscriber_idとcurrent*)を持つ一意のインデックスを作成することはできません。 「記録 - 変更の歴史。
したがって、インデックスは一意である必要があります current == 'c' および任意のsubscriber_id。
それは、「具体化されたビュー」のようなものを使用してOracle DBで行うことができます。 current = 'c' これらの2つのフィールドで一意のインデックスを作成します: *subscriber_id、current *。
質問は: これはMySQLでどのように行うことができますか?
解決
これを使用することができます NULL
値。使用する場合 NULL
それ以外の "H
", MySQLは、評価するときに行を無視します UNIQUE
制約:
A UNIQUE index creates a constraint such that all values in the index must be
distinct. An error occurs if you try to add a new row with a key value that
matches an existing row. This constraint does not apply to NULL values except
for the BDB storage engine. For other engines, a UNIQUE index permits multiple
NULL values for columns that can contain NULL.
今、これは少し不正行為をしており、それはあなたがあなたがそれを望むようにあなたのデータを正確に持っていないことを意味します。したがって、このソリューションはあなたのニーズに合わないかもしれません。しかし、もしあなたが できる この方法でデータを作り直すと、機能するはずです。
所属していません StackOverflow