質問

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.

今、これは少し不正行為をしており、それはあなたがあなたがそれを望むようにあなたのデータを正確に持っていないことを意味します。したがって、このソリューションはあなたのニーズに合わないかもしれません。しかし、もしあなたが できる この方法でデータを作り直すと、機能するはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top