1

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*) を持つ一意のインデックスを作成することはできません。 " レコード - 変更履歴。

したがって、インデックスは現在の == 'C'および任意のsubscriber_idに対してのみ一意である必要があります。

これは、「マテリアライズド ビュー」のようなものを使用して Oracle DB で実行できます。この場合、current = 'C' のレコードのみを含むマテリアライズド ビューを作成し、*subscriber_id、current* の 2 つのフィールドで一意のインデックスを作成できます。

問題は、MySQL でこれを行うにはどうすればよいかということです。

4

1 に答える 1

2

これは、値を使用して行うことができNULLます。NULL" " の代わりに使用するとHMySQL は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.

さて、これは少しごまかしであり、データを思いどおりに正確に取得できないことを意味します。したがって、このソリューションはニーズに合わない場合があります。しかし、この方法でデータを作り直すことができれば、うまくいくはずです

于 2011-01-17T22:26:42.013 に答える