如何为Decision表创建条件为id_decision=1的唯一索引?
实现请求仅能被接受一次的唯一约束
你需要的是部分唯一索引,用来确保每个请求(id_request)只能存在一条标记为“已接受”(id_decision=1)的记录,完全匹配你的业务规则。以下是不同数据库的实现方式:
PostgreSQL / SQL Server
直接创建带过滤条件的唯一索引即可,语法简洁高效:
CREATE UNIQUE INDEX unique_decision_accepted ON Decision(id_request) WHERE id_decision = 1;
- 索引仅作用于
id_decision=1的记录,确保同一id_request不会出现多条已接受的记录 id_decision≠1的记录不受此索引限制,可自由提交多次
MySQL 8.0.16+
MySQL通过函数型唯一索引实现类似逻辑,利用唯一索引不约束NULL值的特性:
CREATE UNIQUE INDEX unique_decision_accepted ON Decision(id_request, (CASE WHEN id_decision = 1 THEN 1 ELSE NULL END));
- 当
id_decision=1时,表达式返回固定值1,此时会强制id_request唯一 - 当
id_decision≠1时,表达式返回NULL,不会触发唯一约束,允许重复提交
注意:你最初写的CREATE INDEX是普通索引,无法保证唯一性,必须使用CREATE UNIQUE INDEX才能实现业务要求的约束。
内容的提问来源于stack exchange,提问作者imstuckaf
相关产品推荐
相关产品推荐

