2017-08-06 136 views
0

我希望这个作品以某种方式:Mysql的唯一约束只适用,如果一个字段有specfic值

我有一个MySQL表有3列:

id = int 
state = enum('visible', 'moderated', 'deleted') 
user_id = int 

用户不应该有超过1项,这是'可见'或'主持',但他可以有无尽的'删除'条目。

所以,我需要在user_ID的唯一密钥,只适用,如果状态是“看得见”或“缓和”

回答

1

基本上有两种选择,第一种是相当简单,但需要在表中的变化结构和应用逻辑。

如果您使用NULL值而不是'deleted',那么您可以根据给定的user_id(在(user_id,state)上具有唯一的常量)具有尽可能多的“删除”行。你的表结构是这样的:

id = int 
state = enum('visible', 'moderated') NULL 
user_id = int 

另一种选择将包括在之后的更新/后插入检查触发不管你是不是破坏了你contraint和投掷“SQL异常”韦迪https://dev.mysql.com/doc/refman/5.5/en/signal.html

+0

NULL是不幸在我的情况下没有选择(因为应用程序设计)。但我会研究信号。谢谢! – sugo