23

我正在尝试为两列创建一个 UNIQUE INDEX 约束,但仅当另一列包含值 1 时。例如,column_1并且column_2仅在active = 1. 任何包含的行都active = 0可以与另一行共享值,column_1column_2不管另一行的值active是什么。但是active = 1不能column_1column_2具有active = 1.

我所说的“共享”是指在同一列中具有相同值的两行。示例:row1.a = row2.a AND row1.b = row2.b。仅当 row1 中的两列都与 row2 中的其他两列匹配时,才会共享值。

我希望我说清楚了。:\

4

6 回答 6

17

您可以尝试使用 column_1、column_2 和 active 创建多列 UNIQUE 索引,然后为不需要唯一性的行设置 active=NULL。或者,您可以使用触发器(请参阅 MySQL 触发器语法) 并检查每个插入/更新的行,如果这些值已经在表中 - 但我认为它会相当慢。

于 2011-02-10T10:37:53.217 回答
5

我正在尝试为两列创建 UNIQUE INDEX 约束,但仅当另一列包含值 1

您可以将“另一列”的值设置为不等于 1 的唯一值。例如记录的 id。

然后可以将唯一索引约束应用于所有三列,包括“另一列”。让我们称“另一列”columnX。如果要将唯一约束应用于记录,请将 columnX 的值设置为 1。如果您不想应用唯一约束,请将 columnX 的值设置为唯一值。

然后不需要额外的工作/触发器。所有三列的唯一索引可以解决您的问题。

于 2017-03-30T03:43:03.940 回答
1

我不确定 MySQL 的语法,但它应该与 SQL Server 具有几乎相同的东西:

CREATE UNIQUE INDEX [UNQ_Column1Column2OnAtive_MyTable]
  ON dbo.[MyTable]([column1,column2)
  WHERE   ([active] = 1);

该索引将确保如果 active=1 则 column1 和 column2 组合在整个表中是唯一的。

于 2021-05-29T06:23:55.207 回答
0

在 SQL Server 中,这可以通过检查约束来完成,但是我不知道 MySQL 是否支持类似的东西。

在任何数据库上都可以使用的是,您可以将表一分为二。如果 active = 0 的记录只是历史记录,并且永远不会再次激活,您可以将它们移动到另一个表,并在原始表上设置一个简单的唯一约束。

于 2011-02-10T10:18:15.177 回答
0

我不确定我是否 100% 了解您,但假设您有一个包含状态列的表,并且您想确保只有一个原始状态为“A”(活动)。您可以处理许多状态为“I”或“Z”或其他任何内容的行。状态为“A”时只允许一行。

这会成功的。

  CREATE UNIQUE INDEX [Idx_EvalHeaderOnlyOneActive]
  ON [dbo].[EvalHeader]([Hdr Status])
  WHERE [Hdr Status] = 'A';
于 2021-06-17T19:29:24.433 回答
-2

索引不受外部影响。这种约束必须在您的数据库之外实现。

于 2011-02-10T10:12:40.823 回答