【问题标题】:Mysql UNIQUE INDEX on 3 fields when one field equals a value当一个字段等于一个值时,Mysql UNIQUE INDEX 在 3 个字段上
【发布时间】:2013-07-23 08:29:17
【问题描述】:

当其中一个字段为 True 时,我想在 3 个字段上添加唯一索引。即等于1

UNIQUE INDEX pkg_box_delivered (package_id, box_id, Delivered) WHERE Delivered = 1;

我需要一个 Alter 语句以及如何将它添加到 Create Table 语句中。

【问题讨论】:

  • 明确地说,您想强制执行一个约束,即没有两条记录具有相同的 package_idbox_id 值 - 但仅限于 delivered = 1?

标签: mysql alter-table create-table unique-index


【解决方案1】:

您不能在表中的一些行上创建索引 - 只能在表中的所有行上创建索引,而不管值如何。

我需要一个 Alter 语句以及如何将它添加到 Create Table 语句中

您使用 ALTER TABLE 更改现有表的定义,而 CREATE TABLE 创建一个表及其字段,因此如果该表已经存在......

 ALTER TABLE yourtablename 
   ADD UNIQUE INDEX pkg_box_delivered (package_id, box_id, delivered);

或者如果它不存在......

 CREATE TABLE yourtablename (
         package_id INT NOT NULL,
         box_id INT NOT NULL,
         delivered BOOLEAN,
         ...
         UNIQUE INDEX pkg_box_delivered (package_id, box_id, delivered)
 );

正如您不能有选择地将索引应用于某些行一样,您也无法有选择地应用唯一约束。您需要添加一个触发器来强制执行此操作。

【讨论】:

  • 谢谢,但我已经知道这些声明。问题是我只希望那些在交付 = 1 时是唯一的,但我不能有触发器,因为我无权访问何时将项目输入表中。
  • 我不明白您所说的“我...希望那些在交付时是唯一的 = 1”如果您的意思是字段的组合值仅在交付时是唯一的=1 那么看我回答的最后一句话。
  • 我知道我现在需要一个触发器,但我不知道它应该是什么样子。此外,我的数据库中已经有无法删除的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多