如何在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
相关产品推荐
相关产品推荐

