SQLite插入操作中如何在字段引用ROWID生成默认值?
可以实现,两种常用方案:
方案一:用AFTER INSERT触发器(推荐)
你的表中id是INTEGER PRIMARY KEY,它会自动映射到SQLite的ROWID,所以可以通过触发器在插入后自动补全name值:
- 先给
name字段设置一个默认值(因为NOT NULL约束不允许字段为空):
ALTER TABLE data ALTER COLUMN name SET DEFAULT '';
- 创建触发器,当插入的name为默认空字符串时,自动更新为
'data'||id格式:
CREATE TRIGGER auto_fill_name AFTER INSERT ON data FOR EACH ROW WHEN NEW.name = '' BEGIN UPDATE data SET name = 'data' || NEW.id WHERE id = NEW.id; END;
这样用户插入时,若不提供name值,会先用默认空字符串插入,触发器立刻将name替换成data+id(即你要的data+ROWID格式);若用户提供了name,则直接使用用户输入的值。
方案二:分两步手动操作(无需修改表结构)
先插入带临时占位值的记录,获取生成的ID后再更新name:
-- 插入临时记录 INSERT INTO data (name) VALUES ('temp'); -- 获取刚生成的ID SELECT last_insert_rowid() INTO @new_id; -- 更新为目标格式的name UPDATE data SET name = 'data' || @new_id WHERE id = @new_id;
这种方法不是原子操作,若中间出现异常可能会残留临时值,不如触发器方案稳妥。
注:因为id是主键,和SQLite的ROWID完全等价,所以用NEW.id和直接引用ROWID效果一致,用id更直观。
内容的提问来源于stack exchange,提问作者MishaP
相关产品推荐
相关产品推荐

