MYSQL中带条件的唯一约束

4
在Postgres中,我们定义了一个约束,可以限制表中某个值的条目数量为一。我们创建了以下约束:

create unique index list$default$uk on list_group(visitor_uid) where list_type = 'default';

这意味着唯一约束仅在list_type='default'时应用,因此表中每个访客只能有一个“默认”列表。
似乎MySQL不支持唯一约束上的额外where条件。那么,在MySQL的数据库模式中,是否有其他方法来支持此功能?
5个回答

2

MYSQL不支持这种类型的约束。

您应该使用存储过程来插入数据,以便进行一些检查和验证。

为什么不将默认值定义为必须具有1作为主键?这样,普通唯一约束就已经足够了。

如果没有合适的解决方案,您还可以考虑更改数据模型。


0

实际上它是存在的。大多数约束取决于表引擎。 我认为InnoDB支持此功能。

要实现这一点,您必须添加一个具有唯一组合的UNIQUE索引:

ALTER TABLE visitor ADD UNIQUE unique_default_visitor( visitor_uid, list_type );

是的,不完全正确。你所提供的代码存在问题,因为每个list_group都必须为每个访问者拥有唯一的list_type。这并不是我们想要的。我们想要实现的是,只允许每个访问者拥有一个带有list_type='default'的单一列表组。对于其他list_types,如果存在重复项也没有关系。 - harmanjd
1
好的,我不知道在MySQL中如何实现这一点,因为存储引擎尚未支持CHECK约束:http://forums.mysql.com/read.php?136,152474,240479#msg-240479。但是,正如codymanix所说,如果在数据库中强制执行此规则是必要的,我宁愿修改数据结构。 - instanceof me

0

我从未使用过MySQL,但也许你可以像这样创建一个索引:

CREATE UNIQUE INDEX list$default$uk ON list_group ((CASE WHEN list_type='default' THEN NULL ELSE visitor_uid END));

解释: 唯一索引不应关心 NULL 值。因此,请确保索引表达式在 list_type <> 'default' 的每一行返回 NULL。


看起来与我们为Oracle做的类似(使用解码)。但是当我尝试时,这是我得到的结果: mysql> CREATE UNIQUE INDEX list$default$uk ON list_group ((CASE WHEN list_type='default' THEN NULL ELSE visitor_uid END));ERROR 1064 (42000): 在您的SQL语法中有一个错误;请检查与您的MySQL服务器版本相对应的手册,以了解在第1行附近使用的正确语法。 mysql> - harmanjd

0

我的建议:

为什么不创建一个列只用于存储唯一值(可以称之为is_list_type_default),另一个列用于存储所有值。如果这样做,您可以在第一列上放置一个unique约束。


0

我想你需要编写一个触发器来检查它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接