MySQL 多字段唯一索引

标签 mysql unique-constraint unique-index

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

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/

相关文章:

MySQL添加FOREIGN KEY的问题?

mysql - 事件发生在创建时间而不是开始时间

sql - 没有延迟约束的正确工作模式是什么?

java - 使用注释的条件唯一约束

结合唯一键的 MySQL 性能

oracle - 强制执行唯一/主键 - 删除索引

mysql - 如何为表中的每个唯一值添加 ID

php - PHP 中的全局捕获

java-如何检查JSP页面中是否存在值?

indexing - 确保 MS SQL 中多个大型 URL 字段的唯一性