【问题标题】:MySQL unique index by multiple fieldsMySQL 多个字段的唯一索引
【发布时间】:2011-01-17 22:19:27
【问题描述】:

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

CREAT TABLE coverages (
   id INT, # primary key, auto-increment
   subscriber_id INT,
   current CHAR,  # - could be "C" or "H".
   record_version INT,
   # etc.
);

它存储我们订阅者的“覆盖范围”。字段“current”表示这是当前/原始记录(“C”)还是历史记录(“H”)。

对于给定的订阅者,我们只能有一个当前的“C”覆盖,但我们不能创建具有 2 个字段(*subscriber_id 和 current*)的唯一索引,因为对于任何给定的“C”记录,都可能有任何数字“H”条记录 - 更改历史记录。

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

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

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

【问题讨论】:

  • 唯一索引的目的是什么?非唯一索引不能做什么?这听起来有点像过早的优化...
  • 我们有多个应用程序服务器 (web),它们可以尝试同时插入相同的记录(并且确实发生了)。我们需要防止覆盖表中出现重复。

标签: mysql unique-constraint unique-index


【解决方案1】:

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

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

【讨论】:

  • 出于某种原因,我没有想到 NULL :) 这对我们来说非常有用,至少作为一个短期解决方案......从长远来看,我们将把这张表分成二:coverages和coverage_history。非常感谢,先生!!!
猜你喜欢
  • 1970-01-01
  • 2016-01-18
  • 2010-11-25
  • 2014-02-24
  • 2012-03-12
  • 2015-06-16
  • 2011-03-22
  • 1970-01-01
  • 2011-01-31
相关资源
最近更新 更多