我想要一个数据库表,其中包含(以及其他附加字段):
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/