2009-06-12 152 views
3

在postgres中,我们定义了一个约束条件,它基本上允许我们将具有某个值的表中的条目数限制为1。我们创建了这个约束:使用MYSQL条件的唯一约束

在list_group(visitor_uid)上创建唯一索引列表$ default $ uk其中list_type ='default';

这意味着唯一约束只适用于list_type ='default',以便表中每个访问者只能有一个'默认'列表。

它看起来像MySql不支持额外的唯一约束。是否有另一种方法可以在MySQL的数据库模式中支持这一点?

回答

2

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

你应该使用存储过程来插入数据,所以你可以做一些检查和验证。

为什么不定义你的默认为它必须有1作为主键?这样,pk上的正常唯一约束已经足够了。

如果没有任何东西适合你,你也可以考虑改变你的数据模型。

0

其实它存在。大多数限制依赖于表引擎。 我认为InnoDB支持这一点。

要做到这一点,你必须添加一个唯一索引与独特组合:

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

是的 - 不完全。你有什么问题是,每个list_group必须为每个访问者提供一个唯一的list_type。我们不希望这样。我们试图完成的是只允许每个访问者拥有一个list_type ='default'的列表组。对于其他list_types,如果有重复,则无关紧要。 – harmanjd 2009-06-12 15:59:20

+1

ho,对。然后我不知道在MySQL中这样做的方法,因为存储引擎不支持CHECK常量:http://forums.mysql.com/read.php?136,152474,240479#msg-240479。但是,就像codymanix说的那样,如果在数据库中强制执行这个规则,我宁愿修改数据结构。 – 2009-06-12 16:46:15

0

我认为你必须写一个触发器来检查它。

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。

0

我的两分钱:

你为什么不只是创建一个列来存储的独特价值(也许你可以把它像is_list_type_default),另一个存储所有的值。如果你这样做,你可以在第一列上设置一个unique限制。