You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL:限制同一APP列对应STATUS列true值仅出现一次

实现APP与STATUS(true)的唯一性约束方案

完全可以通过数据库索引或约束实现这个需求,不同数据库有对应的实现方式,以下是几种常用方案:

1. 部分唯一索引(Partial Unique Index)

适合PostgreSQL、SQLite(3.31+)等支持部分索引的数据库。这种索引仅对满足特定条件的行生效,完美匹配你的需求:

CREATE UNIQUE INDEX idx_app_status_true ON your_table (app) WHERE status = true;

这个索引会强制:当status为true时,同一APP值只能存在一条记录;而status为false的行不受约束,允许同一APP下有多条。

2. 函数式唯一索引

对于不直接支持部分唯一索引的数据库(比如MySQL),可以用函数生成辅助值,结合唯一索引实现效果:

CREATE UNIQUE INDEX idx_app_status_true ON your_table (app, CASE WHEN status = true THEN 1 ELSE NULL END);

原理是MySQL的唯一索引会忽略NULL值:当status为false时,CASE返回NULL,不会触发唯一性校验;当status为true时,返回固定值1,此时(app, 1)的组合必须唯一,从而限制同一APP只能有一条status=true的记录。

3. 触发器(备选方案)

如果上述索引方案无法适配你的数据库,可通过触发器实现逻辑校验:

以MySQL为例,创建插入/更新前的触发器,检查当前APP对应的status=true记录数:

DELIMITER //
CREATE TRIGGER check_unique_true_status
BEFORE INSERT ON your_table
FOR EACH ROW
BEGIN
    DECLARE count_true INT;
    SELECT COUNT(*) INTO count_true
    FROM your_table
    WHERE app = NEW.app AND status = true;
    IF count_true > 0 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '同一APP只能存在一条status为true的记录';
    END IF;
END //
DELIMITER ;

注意:触发器性能不如索引方案,因为每次操作都要执行查询校验,仅建议在无法使用索引时采用。


内容的提问来源于stack exchange,提问作者Eugene Gorelik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:36:31