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

如何在sqlite3中基于另一字段值设置约束 为文本RPG职业分配默认Power值

实现方案

SQLite 可以通过两种常用方式实现你要的字段自动映射逻辑:

方案1:使用生成列(优先推荐,需 SQLite 3.31.0 及以上版本)

生成列是 SQLite 高版本提供的特性,字段值由数据库自动基于其他字段计算生成,全程不需要业务代码干预,写入、更新职业时都会自动同步 Power 值。
建表语句参考:

CREATE TABLE players (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    nickname TEXT NOT NULL,
    class TEXT NOT NULL CHECK (class IN ('Hunter', 'Warrior')), -- 先约束职业的合法取值,避免异常值
    power INTEGER GENERATED ALWAYS AS (
        CASE class
            WHEN 'Hunter' THEN 3
            WHEN 'Warrior' THEN 5
        END
    ) STORED, -- STORED 表示值会实际落盘存储,换成 VIRTUAL 则是查询时实时计算,按需选择即可
    -- 其他自定义属性字段
    hp INTEGER NOT NULL DEFAULT 100
);

使用这个方案时,插入、更新数据都不需要主动操作 power 字段,数据库会自动维护。

方案2:使用 BEFORE INSERT 触发器(兼容全版本 SQLite)

如果你的环境 SQLite 版本低于 3.31.0 不支持生成列,可以用触发器实现插入时自动赋值:
首先创建基础表:

CREATE TABLE players (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    nickname TEXT NOT NULL,
    class TEXT NOT NULL CHECK (class IN ('Hunter', 'Warrior')),
    power INTEGER NOT NULL,
    hp INTEGER NOT NULL DEFAULT 100
);

再创建插入触发逻辑:

CREATE TRIGGER auto_set_player_power BEFORE INSERT ON players
FOR EACH ROW
BEGIN
    SET NEW.power = CASE NEW.class
        WHEN 'Hunter' THEN 3
        WHEN 'Warrior' THEN 5
    END;
END;

如果需要支持修改职业时同步更新 Power 值,再加一个 BEFORE UPDATE 触发器就可以,逻辑和上面完全一致。

注意事项

  • 两个方案都加了 CHECK 约束限制职业的可选范围,避免出现未定义的职业导致 Power 赋值为空
  • 后续新增职业只需要更新对应 CASE 分支的逻辑即可,不需要修改业务侧代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:54:00