索引的部分唯一性

时间:2016-02-16 10:18:44

标签: mysql indexing

我希望有一个DB表(包括其他字段):

int id  
int group_id   
varchar(20) code  
int code_status

代码是随机生成的,我想在特定code_status(例如0)的范围内强制执行group_id +代码的唯一性。 即group_id+code where codes_staus=0是唯一的。 所以例如它是o.k.拥有:

id,group_id,code,code_status  
1,1,1,0  
2,1,2,0  

因为代码是唯一的。 它也应该是o.k.拥有:

1,1,1,1  
2,1,1,1
3,1,1,0  

因为即使group + code不是唯一的o.k.只要状态不为0。

但是

1,1,1,0
1,1,1,0

不应该被允许。

我可以使用某种形式的索引来强制这种类型的部分唯一性吗? 或者我应该在任何新插入之前搜索group_id + code + 0?

我需要这个可以在MySQL上工作,但也会欣赏适用于其他数据库的解决方案,只是为了扩展我的知识。

1 个答案:

答案 0 :(得分:1)

我真的不认为这可以通过索引来解决。您不能仅为列的某些值设置索引。

但你可以用MySQL解决它:

INSERT INTO your_table (group_id,code,code_status) 
    SELECT 1, 2, 0
    FROM dual
    WHERE NOT EXISTS (
        SELECT * 
        FROM your_table 
        WHERE group_id = 1 AND code= 2 AND code_status = 0
    )

您可能还需要为UPDATE执行此操作。

有两张桌子。一个用于code_status = 0(您可以在其中放置您的唯一索引),另一个用于另一个,并创建一个视图以合并它们。

table_1
-----------------
int id  
int group_id   
varchar(20) code

table_2
-----------------
int id  
int group_id   
varchar(20) code
int code_status

视图

CREATE VIEW all_codes AS 
SELECT id, group_id, code, 0 AS code_status FROM table_1 
UNION SELECT * FROM table_2

你会遇到碰撞ID,但可以通过将自动增量设置为对其中一个表甚至另一个表使用奇数来解决。