我们的数据库中有一种特殊的表,用于存储其自身更改的历史记录。所谓的“自存档”表:
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”记录 - 更改历史。
因此索引应该只对 current == 'C' 和任何 subscriber_id 是唯一的。
这可以在 Oracle DB 中使用诸如“物化 View ”之类的东西来完成:我们可以在其中创建一个物化 View ,该 View 将仅包含具有 current = 'C' 的记录,并使用这些创建一个唯一索引2 个字段:*subscriber_id、current*。
问题是:如何在 MySQL 中完成此操作?
最佳答案
您可以使用 NULL
值来做到这一点。如果您使用 NULL
而不是“H
”,MySQL will ignore the row when evaluating the UNIQUE
constraint :
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.
现在,这有点作弊,这意味着您无法完全按照自己的意愿获得数据。所以这个解决方案可能不符合您的需求。但是,如果您可以以这种方式重新处理您的数据,它应该可以工作。
关于MySQL 多字段唯一索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4718554/