name text
);
然后执行如下的命令,就会在建立test.db文件的同时,在该test.db文件中建立table1和table2两个表。
sqlite3.exe test.db < sql.script
在使用createtable语句创建表时还可以为每一个字段指定默认值,如下面的SQL语句所示:
create table table1 (
id integerprimary key,
age int default 20,
name text
);
create table table2(
id integerprimary key,
type_idinteger,
name text default 'name1'
); 6.4.3模糊查询
Sqlite的模糊查询与其他数据库类似,都使用了like关键字和%通配符。不过Sqlite在处理中文时会遇到一些麻烦。例如,使用下面的SQL语句向table2插入了一条记录。
insert into table2(id, type_id, name) values(1, 20,'手机操作系统');
在Sqlite控制台中使用如下的SQL查询是没有问题的。
select * from table2 where name =
'手机操作系统';
但如果使用下面的模糊查询语句,则无法查询到记录。
select * from table2 where name like
'手机%';
发生这种事情的原因是因为Sqlite控制台在保存中文时使用的编码格式是GB2312,而执行like操作时使用的是UTF-8。读者可以使用如下的命令来查看Sqlite控制台当前的编码格式。
PRAGMA encoding;
为了可以使用like模糊查询中文,作者建议使用6.4.1节介绍的SQLite Expert Professional来执行insert、update等SQL语句来编辑数据。在这个工具中会直接使用UTF-8来保存中文。 6.4.4分页显示记录
分页是在Web应用中经常被提到的概念。基本原理是从数据库中获得查询结果的部分数据,然后显示在页面中。虽然本书并没有介绍Web程序的开发,但获得查询结果的部分数据仍然非常重要。
Sqlite和MySQL相同,都使用了limit关键字来限制select语句返回的记录数。limit需要两个参数,第1个参数表示返回的子记录集在父记录集的开始位置(从0开始),第2个参数表示返回子记录集的记录数。第2个参数为可选值,如果不指定这个参数,会获得从起始位置开始往后的所有记录。例如,下面的select语句返回了table2表中从第11条记录开始的100条记录。
select * from table2 limit 10 100 6.4.5事务
如果一次执行多条修改记录(insert、update等)的SQL语句,那么当某一条SQL语句执行失败时,就需要取消其他SQL语句对记录的修改。否则就会造成数据不一致的情况。而事务是解决这个问题的最佳方法。
在Sqlite中可以使用BEGIN来开始一个事件,例如,下面的代码执行了两条SQL语句,如果第2条语句执行失败,那么第1条SQL语句执行的结果就会回滚,相当于没执行这条SQL语句。 BEGIN;
insert into table1(id, name) values(50,'Android');
insert into table2(id, name) values(1, '测试');
如果想显式地回滚记录的修改结果,可以使用ROLLBACK语句,代码如下: BEGIN;
delete from table2; ROLLBACK;
如果想显式地提交记录的修改结果,可以使用COMMIT语句,代码如下: BEGIN;
delete from table2; COMMIT;