多字段唯一约束,其中我们基于空值包含一个或另一个字段

Dan*_*ank 4 mysql constraint mysql-5.6

假设我有四列

| x | y | z | w |
Run Code Online (Sandbox Code Playgroud)

我想要以下约束:

  1. 如果wNULL,那么xyz必须是唯一的。

  2. 如果w不是NULL,则xyw必须是唯一的。

这可能吗?

ype*_*eᵀᴹ 6

首先,对于约束编号 2,不需要什么特别的。一个UNIQUE约束忽略-和接受-NULL值,因此一个简单的唯一约束(w,x,y)将工作得很好执行这一点。

对于约束编号 1,我认为 5.6 版中没有使用 DDL 的方法,因此您最好的选择可能是 @stefan 的触发器解决方案。

如果可以升级到 5.7,则可以GENERATED在其上使用列和唯一索引:

ALTER TABLE t
  ADD wz int GENERATED ALWAYS AS (CASE WHEN w IS NULL THEN z END),
  ADD UNIQUE INDEX x_y_z_uq (x, y, wz) ; 
Run Code Online (Sandbox Code Playgroud)