好好学习,day day up.不能再玩了,学习要紧
零、准备工作
一、创建数据库
>sqlite3 mydb.db
后面的mydb.db为自定义的数据库名,我们可以同命令查看当前连接的数据库
sqlite>.databases
seq name file
--- --------------- ----------------------------------------------------------
0 main D:\Program Files\sqlite\mydb.db
这种方式创建数据库的话,如果不对该数据库进行操作(包括上面的查询),则不会产生该.db文件。
2)通过备份main数据库实现
其实直接运行sqlite3.exe就会生成一个默认的数据库,缺省名即为main,我们可以通过sqlite提供的.backup命令备份这个main数据库来保存到本地。
--运行sqlite
>sqlite3
--备份数据到指定文件->.backup ?DB? FILE Backup DB (default "main") to FILE
sqlite>.backupD:\Program Files\sqlite\mydb.db
这样就将默认数据库main备份到了mydb.db中。
3)还有一个就是连接到已存在的数据库,不是创建哦,我懒得分了,写一起吧
sqlite>ATTACH DATABASE'D:\Program Files\sqlite\mydb.db'AS mydb;
在用上面的命令查看一下数据库如何?
sqlite>.databases
seq name file
--- --------------- ----------------------------------------------------------
0 main
2 mydb D:\Program Files\sqlite\mydb.db
这样,结果就一目了然了,呵呵。在以上情况下,让看看创建表会有什么不同。
这里先通过ATTACH DATABASE命令将一个已经存在的数据库文件attach到当前的连接中,之后再通过指定数据库名的方式在目标数据库中创建数据表,如mydb.testtable。关于该规则还需要给出一些额外的说明,如果我们在创建数据表时没有指定数据库名,那么将会在当前连接的main数据库中创建该表,在一个连接中只能有一个main数据库。
二、创建数据表
专业的说法我也不懂,咱就复制粘贴一下吧:该命令的语法规则和使用方式与大多数关系型数据库基本相同,因此我们还是以示例的方式来演示sqlite中创建表的各种规则。但是对于一些sqlite特有的规则,我们会给予额外的说明。注:以下所有示例均是在sqlite自带命令行工具中完成的。
1).最简单的数据表
sqlite>CREATE TABLE testtable(first_col integer);
这里需要说明的是,对于自定义数据表表名,如testtable,不能以sqlite_开头,因为以该前缀定义的表名都用于sqlite内部。语法和标准的sql语句一样,没什么差异。
期间,我们查看一下现有的数据表
--列出表名清单
sqlite>.tables
--显示结果
testtable
这个暂且不提,继续后面操作。
2). 创建带缺省值的数据表
sqlite>CREATE TABLE mydb.testtable (first_col integer DEFAULT 0,second_col varchar DEFAULT 'hello');
--查询现有的数据表
sqlite> .tables
mydb.testtable testtable
我们可以看到一个是有数据库名mydb,一个没有,以mydb开头的数据表就是连接到mydb.db以后,在此数据库中创建的数据表;而没有库名开头的数据表为main数据库中建立的表。由于运行sqlite3程序时没有以数据库名做参数,所以这个表和缺省的数据库不会保存到本地,如果需要保存,可以通过之前使用的备份命令进行保存。
3). 创建临时表
sqlite>CREATE TEMP TABLE temptable(first_col integer);
在此查看现有的数据表
sqlite> .tables
--结果显示
mydb.testtable temp.temptable testtable
再查看一下数据库就能看出点问题来了
sqlite> .databases
seq name file
--- --------------- --------------------------------
0 main
1 temp
2 mydb D:\Program Files\sqlite\mydb.db
哦?貌似多了个temp数据库。这个临时数据库如果不做保存的话,和创建缺省的数据库一样,不会存到本地。查询的序列号也有讲究,0是main数据库,若运行时以数据库名作为参数,则为创建或打开指定的数据库,而main数据库指代这个指定的数据库;1是临时数据库,这个应该只是作为内存数据库用的吧?没经验,猜测而已。2以后的应该就是ATTACH连接的数据库了,这个自不必多说。@H_938_403@
4). "IF NOT EXISTS"从句 如果当前创建的数据表名已经存在,即与已经存在的表名、视图名和索引名冲突,那么本次创建操作将失败并报错。然而如果在创建表时加上"IF NOT EXISTS"从句,那么本次创建操作将不会有任何影响,即不会有错误抛出,除非当前的表名和某一索引名冲突。
sqlite>CREATE TABLE testtable (first_col integer);
Error: table testtable already exists
sqlite>CREATE TABLE IF NOT EXISTS testtable (first_col integer);
5). CREATE TABLE ... AS SELECT:
通过该方式创建的数据表将与SELECT查询返回的结果集具有相同的Schema信息,但是不包含缺省值和主键等约束信息。然而新创建的表将会包含结果集返回的所有数据。
sqlite>CREATE TABLE testtable2 AS SELECT * FROM testtable;
sqlite> .schematesttable2
CREATE TABLE testtable2(first_col INT);
.schema命令是sqlite3命令行工具的内置命令,用于显示当前数据表的CREATE TABLE语句。
对于这一点,我试了一下,.schema这个命令只对main数据库有效。而CREATE TABLE ... AS SELECT会将数据类型转换为sqlite支持的五种最基本的数据类型。比如之前的varchar转为TEXT。@H_938_403@原来如此
五种数据类型如下:
1.NULL:空值。
2.INTEGER:带符号的整型,具体取决有存入数字的范围大小。
3.REAL:浮点数字,存储为8-byte IEEE浮点数。
4.TEXT:字符串文本。
5.BLOB:二进制对象。
但实际上,sqlite3也接受如下的数据类型:
smallint 16 位元的整数。
interger 32 位元的整数。
decimal(p,s) p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。
float 32位元的实数。
double 64位元的实数。
char(n) n 长度的字串,n不能超过 254。
varchar(n) 长度不固定且其最大长度为 n 的字串,n不能超过 4000。
graphic(n) 和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。这个形态是为了支援两个字元长度的字体,例如中文字。
vargraphic(n) 可变长度且其最大长度为 n 的双字元字串,n不能超过 2000
date 包含了 年份、月份、日期。
time 包含了 小时、分钟、秒。
timestamp 包含了 年、月、日、时、分、秒、千分之一秒。
datetime 包含日期时间格式,必须写成'2010-08-05'不能写为'2010-8-5',否则在读取时会产生错误!
扯得远了,回到正题。
6). 主键约束:
--直接在字段的定义上指定主键。
sqlite>CREATE TABLE testtable (first_col integer PRIMARY KEY ASC);
ASC是升序,DESC是降序,你懂的。@H_938_403@
--在所有字段已经定义完毕后,再定义表的数约束,这里定义的是基于first_col和second_col的联合主键。
sqlite>CREATE TABLE testtable2 (
...> first_col integer,
...> second_col integer,sans-serif; line-height:18px">...> PRIMARY KEY (first_col,second_col)
...> );
和其他关系型数据库一样,主键必须是唯一的。 7). 唯一性约束:
--直接在字段的定义上指定唯一性约束。
sqlite>CREATE TABLE testtable (first_col integer UNIQUE);
--在所有字段已经定义完毕后,在定义表的唯一性约束,这里定义的是基于两个列的唯一性约束。
...> UNIQUE (first_col,second_col)
...> );
在sqlite中,NULL值被视为和其他任何值都是不同的,这样包括和其他的NULL值,如下例:
sqlite>DELETE FROM testtable;
sqlite>SELECT count(*) FROM testtable;
count(*)
----------
0
sqlite>INSERT INTO testtable VALUES(NULL);
sqlite>INSERT INTO testtable VALUES(NULL);
----------
2
由此可见,两次插入的NULL值均插入成功。
后面的改天再学习吧,天黑,收摊~~~~