insert into foods (name, type_id) values ('Cinnamon Bobka', 1);
如果在insert语句中为每一列都提供了值,可以省去列名,顺序是表创建时的顺序。
insert into foods values(NULL, 1, 'Blueberry Bobka');
insert into foods values (null, (select id from food_types where name='Bakery'), 'Blackberry Bobka');
作为一部分。
select * from foods where name like '%Bobka';
作为全部。
insert into foods select last_insert_rowid()+1, type_id, name from foods where name='Chocolate Bobka';
这种创建方法(Create Table As Select),会丢失约束信息,包括自增列、indexes、UNIQUE约束等等。
update table set update_list where predicate;
delete from table where predicate;
数据完整性是值创建和保持table之间的关系。有四种完整性
数据完整性通过约束实现。在SQLite中,数据完整性包含了对冲突解决的支持。
主值是为了保证每一个数据都可以被寻址。主值包括一列或更多列,其中有unique约束。
primary key约束。创建table时候一定会被创建,无论是你是否定义。这个列名是rowid,有两个别名_rowid_和oid。
如果一列的约束是integer primary key,那么SQLite会为这列创建一个默认值,保证和其他行的值不同。这里也是rowid的别名。由于SQLite使用有符号64位整数来存储主值,因此主值的最大值是9,223,372,036,854,775,807。
如果主值定义中包括autoinrement,那么rowid不会被重复利用,只会产生比当前最大值大的值。SQLite会保存最大的rowid在系统table中,叫做sqlite_sequence。如果大于int64max,在插入时会产生SQLITE_FULL错误。
sqlite> select * from sqlite_sequence; name seq ---------- ---------- maxed_out 10
sqlite> insert into maxed_out values(2120, 'works'); sqlite> insert into maxed_out values(null, 'works'); Error: database or disk is full
包括type和range两个方面。
- 默认值
default关键字提供了默认值。还有三个保留字
- current_time. (HH:MM:SS)格式 - current_data. (YYYY-MM-DD)格式 - current_timestamp. (YYYY-MM-DD HH:MM:SS)格式
create table table_name ( column_definition refernces foreign_table(column_name) on {delete|update} integrity_action [not] deferrable [initially {deferred|immeiate},] ...);
integrity_action有五种。
Collation是指文本是如何比较的。
collate关键字定义了某一行的collation
在一列中可以包含不同storage class的值。比较方式如下:
view是虚拟的表,也被称为derived tables,因为值是由其他表生成的,在使用时候被动态生成。
create view name as select-stmt
view在SQLite中不支持update,可以用触发器来达到同样效果。
索引用来在某些情况下提高查询的速度。
索引会增加数据库的大小,因为拷贝了需要索引的列。
索引需要被维护。因此会降低插入、更新等操作的速度。
create index [unique] index_name on table_name (columns)
unique会增加约束给索引以及索引列。
drop index index_name
create [temp|temporary] trigger name [before|after] [insert|delete|update|update of columns] on table action
事务定义了一组SQL命令的边界,这组命令或者全部成功,或者全部失败。数据库完整性的atomic原则。
事务和三个命令有关
1. begin
2. commit
3. rollback
默认每一个SQL语句在自己的事务中运行,每一个语句都会成功或失败后回滚。这种操作类型被称为autocommit mode
SQLite支持savepoint和release命令。
savepoint用户在事务中设置一个点,SQLite可以revert到这个点。
savepoint justincase rollback [transaction] to justincase
以严格程度排序如下
update or resolution table set (value_list) where predicate
锁和事务是紧密相关的。SQLite使用粗粒度的锁,当一个session在向数据库中写数据时,其他的session都被锁定。
事务类型
当只有一个session时,使用默认的即可。
attach [database] filename as database_name
SQLite没有配置文件,所有的配置通过pragmas实现。
一个session可以在内存中缓存多少数据库页(pages).
sqlite> pragma cache_size = 10000; sqlite> pragma cache_size; 10000
temp_store:, default,file或memory。临时数据的位置
temp_store_directory:,临时数据存放文件的位置。
必须在创建数据库之前设置。
sqlite_master是包括表、view、index、trigger的系统表。
sqlite> explain query plan select * from sqlite_master; selectid order from detail ---------- ---------- ---------- ------------------------ 0 0 0 SCAN TABLE sqlite_master