mysql - 索引的部分唯一性

标签 mysql indexing

我想要一个数据库表,其中包含(以及其他附加字段):

int id  
int group_id   
varchar(20) code  
int code_status

代码是随机生成的,我想在特定代码状态(例如 0)的范围内强制执行 group_id+代码的唯一性。 即让 group_id+code where codes_staus=0 是唯一的。 这样就可以了。拥有:

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

因为代码是唯一的。 也应该没问题拥有:

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

因为即使 group+code 不是唯一的,它也可以。只要状态不为0。

但是有

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

不应该被允许。

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

我需要它在 MySQL 上工作,但也希望能在其他数据库上工作的解决方案只是为了扩展我的知识。

最佳答案

我真的不认为这可以用索引来解决。您不能仅对列的某些值放置索引。

但是你可以用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(您可以在其中放置唯一索引),另一个用于另一个,并创建一个 View 来合并它们。

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

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

和 View

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

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

关于mysql - 索引的部分唯一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35429748/

相关文章:

mysql - mysql中的第二个自动增量

php - MySQL JOIN 语句帮助

php - get_records_sql 使用moodle中的内连接仅返回一个结果

indexing - Field.Index.NOT_ANALYZED_NO_NORMS 是什么意思

c++ - 建立索引 : Copies or pointers?

python 索引错误: list index out of range on arp_scan script

Oracle:如何跳过子键范围进行索引范围扫描?

mysql - 如果子查询在 MySQL 中返回多于 1 行,如何将 JSON 放入列数据中

mysql - 在mysql中创建索引需要多长时间?

mysql - 获取好友的所有好友列表