SQLite阶段性数据库维护

SQLite3数据库插入冲突转更新

背景

SQLite利用insert插入数据时,可能发生主键(唯一键)冲突,若想在冲突时变更为update语句,可以借助于SQLite的ON CONFLICT ([key]) DO 语句

语法

INSERT INTO table_name (key ...)
VALUES (val ...)
ON CONFLICT ([key])
DO UPDATE SET key1 = val1, ... , keyn = valn;

创建表secs_ceid, 由此表举例

CREATE TABLE "secs_ceid" (
"ceid"  INT NOT NULL,
"name"  TEXT,
"type"  INT,
"remark"  TEXT,
"isuse"  BOOLEAN NOT NULL DEFAULT (0),
PRIMARY KEY ("ceid" ASC)
); 
INSERT INTO secs_ceid (ceid, name, type, remark, isuse) VALUES (1, 'STATE_CHANGED', 0, '状态改变', 1);
INSERT INTO secs_ceid (ceid, name, type, remark, isuse) VALUES (2, 'OFFLINE', 0, '离线', 1);
ceid[主键]nametyperemarkisuse
1STATE_CHANGED0状态改变1
2OFFLINE0离线1

记录插入

ceid为唯一键,如果此时插入的ceid表中已经存在,则会报冲突异常
当再次执行这条语句时,SQLite引擎将会报错提示

INSERT INTO secs_ceid (ceid, name, type, remark, isuse) VALUES (1, 'STATE_CHANGED', 0, '状态改变', 1);

报错提示如下

[14:14:22] Error while committing new row: UNIQUE constraint failed: secs_ceid.ceid

此时应该借助SQLite的ON CONFLICT ([key]) DO 语句

INSERT INTO secs_ceid (ceid, name, type, remark, isuse) VALUES (1, 'STATE_CHANGED', 0, '状态改变', 1)
ON CONFLICT (ceid)
DO UPDATE SET  name='STATE_CHANGED',type=0,remark='状态改变',isuse=1;

使用场景

  • 数据时常变更,需要定时同步到SQLite中,主键/唯一键一般不会修改或较少修改时,该方法可以代替delete+insert。
  • 表中某些字段需要插入或阶段性变更时,可以利用ON CONFLICT (key)DO代替insert和update两种操作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值