1

我们的数据库中有一种特殊的表,它本身存储其更改的历史。所谓的“自存档”表:

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”覆盖,但我们不能创建一个包含 2 个字段(*subscriber_id 和 current*)的唯一索引,因为对于任何给定的“C”记录,可能有任意数量的“H " 记录 - 变更历史。

所以索引应该只对当前 == 'C'和任何subscriber_id 是唯一的。

这可以在 Oracle DB 中使用“物化视图”之类的东西来完成:我们可以创建一个物化视图,它只包含current = 'C' 的记录,并使用以下两个字段创建一个唯一索引:*subscriber_id, current*。

问题是:如何在 MySQL 中做到这一点?

4

1 回答 1

2

您可以使用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.

现在,这有点作弊,这意味着您无法完全按照自己的意愿获得数据。因此,此解决方案可能不适合您的需求。但是,如果您可以以这种方式重新处理您的数据,它应该可以工作。

于 2011-01-17T22:26:42.013 回答