SQLite3数据添加、修改和删除

本文讨论SQLite3数据库表数据的添加、修改和删除操作,包括insert into语句、update语句、delete语句的基本应用及语法变形。

添加数据

数据表添加记录时主要使用insert into语句,基本应用格式如下:

SQLite3
insert into <表> (字段1,字段2,...)values(值1,值2,...);

其中,<表>指定数据表的名称,两组括号中的字段和值要一一应用。

接下来使用t1表进行测试,其创建语句如下:

SQLite3
create table t1(
f1 text unique not null,
f2 integer check(f2 in (0,1,2)) default 0,
f3 text,
f4 text);

如果t1表已存在,可以通过“delete from t1;”语句删除其中的测试数据,或使用"drop table t1;"语句删除表后重新创建。

下面的代码会在t1表中添加一条记录,并使用last_insert_rowid()函数返回新记录的ID字段(rowid)数据。

SQLite3
insert into t1(f1,f2) values('user01',1);
select last_insert_rowid();

如果t1表为空表,添加第一条记录的rowid字段数据为1。

insert into语句中的values关键字后还可以使用多组数据同时添加多条记录,如下面的代码。

SQLite3
insert into t1(f1,f2) 
values('user02',2),
('user03',0);
select changes();

执行代码会向t1表中添加两条记录,并显示2,其中,changes()函数可以返回本次事务中insert、update、delete命令改变数据的行数。

此外,total_changes()函数可以返回本次数据库连接以来,insert、update、delete命令改变数据行数量的合计。

insert into语句还有一些变形,如:

  • insert into <表> values(值1,值2,值3...),不指定字段列表,值列表中的数据按表字段的顺序指定。
  • insert into <表>(字段1,字段2) select ...,将select语句的查询结果(一行或多行)添加到<表>中,数据会按指定的字段列表一一对应。使用select语句查询数据的更多操作会在下一篇文章中介绍。
  • insert into <表> default values,添加一条新记录,字段数据使用默认值。
  • insert or ignore into <表>(字段1,字段2,...) valeus(值1,值2,...),当记录主键或唯一键字段数据不存在时添加新记录,主键或唯一键数据存在时不进行任何操作。
  • insert or replace into <表>(字段1,字段2,...) values(值1,值2,...),当记录主键或唯一键字段数据不存在时添加新记录,主键或唯一键数据已存在时则删除原记录并添加新的记录(即执行delete和insert操作)。此语法中,insert or replace可以直接简写为replace。

下面的代码会根据t1表的f1字段数据判断是直接添加数据还是删除后添加新记录。

SQLite3
replace into t1(f1,f2,f4) values('user02',0,'111');

执行语句后,可以使用“select rowid,* from t1;”语句查询t1表记录,查询结果如下图的示。

查询t1表数据

请注意,t1表中rowid字段为2的记录已经删除,而新的f1字段为'user02'的记录rowid字段数据为4,即添加了新的记录。

修改数据

修改表数据时使用update语句,应用格式如下:

SQLite3
update <表> set 字段1=值1,字段2=值2,... where <条件>;

请注意,虽然使用where关键字指定数据更新条件是可选的,但需要谨慎操作,如果不指定更新条件,表中所有记录的数据都会被更新,应确认操作目的是否真的是这样。一般来讲,如果需要更新一条记录的数据,可以使用主键或唯一键字段数据作为更新条件,如下面的代码可以更新f1字段为'user03'的记录数据。

SQLite3
update t1 set f2=0, f3='20206-9-15 15:31:09', f4='222'
where f1='user03';

执行代码会更新f1字段为'user03'记录的f2、f3、f4字段数据。可以使用“select rowid,* from t1;”语句查询t1表的数据,结果如下图所示。

查询t1表数据

讨论使用insert语句添加记录时,replace(insert or replace)语句可以在主键或唯一键字段数据不存在时添加记录,主键或唯一键数据存在时删除原记录并添加新的记录;而实际工作中,可能需要的操作是:当主键或唯一键数据存在时更新记录,不存在时添加记录,此时可以在insert语句后使用on conflict(pk) do update语句,其中,conflict用于指定主键或唯一键字段,即可能产生数据冲突的字段。下面的代码演示了相关操作。

SQLite3
insert into t1(f1,f4)values('user03','111')
on conflict(f1) do update set f4='111';

代码中会以f1字段(唯一键字段)数据作为记录是否存在的依据,本例,f1字段为'user03'的记录已经存在,会执行do关键字后的update操作,即将f4字段数据更新为'111'。执行操作后,t1表的数据如下图所示。

t1表数据

下面的代码演示了主键或唯一键数据不存在时的添加操作。

SQLite3
insert into t1(f1,f4)values('user04','222')
on conflict(f1) do update set f4='222';

执行代码后,t1表的数据如下图所示,其中rowid为5的记录为新增记录。

t1表数据

删除数据

删除数据时使用delete语句,应用格式如下:

SQLite3
delete from <表> where <条件>;

删除语句比较简单,只需要设置表名和删除条件即可。请注意,delete语句中的where关键字和数据删除条件同样为可选,不指定条件时会删除表的所有数据,应确认操作目的是否确实如此。同样的,如果需要删除一条记录,使用主键或唯一键字段作为条件是比较常见的操作,如下面的代码可以从t1表中删除f1字段为'user04'的记录。

SQLite3
delete from t1 where f1='user04';

下一篇文章会讨论数据的查询、排序和联合操作,还会有更多条件设置的讨论和演示。