悄然无声的 Blog
不是我不明白,这世界变化快!
posts - 90,comments - 629,trackbacks - 13

一、数据库定义语言 DDL

在关系型数据库中,数据库中的表 Table、视图 View、索引 Index、关系 Relationship 和触发器 Trigger 等等,构成了数据库的架构 Schema。 在 SQL 语句中,专门有一些语句用来定义数据库架构,这些语句被称为“数据库定义语言”,即 DDL

SQLite 数据库引擎支持下列三种 DDL 语句:

  • CREATE
  • ALTER TABLE
  • DROP

其中,CREATE 语句用来创建表 Table、视图 View、索引 Index、关系 Relationship 和触发器 Trigger, DROP语句用来删除表 Table、视图 View、索引 Index、关系 Relationship 和触发器 Trigger, ALTER TABLE 语句用来改变表的结构。

今天这一篇只涉及到表的相关内容,视图、触发器等到后面再讲。

二、SQLite 中的数据类型

SQLite 数据库中的数据一般由以下几种常用的数据类型组成:

  • NULL - 空值
  • INTEGER - 有符号整数
  • REAL - 浮点数
  • TEXT - 文本字符串
  • BLOB - 二进制数据,如图片、声音等等

SQLite 也可以接受其他数据类型。

三、创建表 CREATE TABLE

首先,创建一个 test.db 数据库并进入 SQLite 命令行环境,还记得怎么做吗?

myqiao@ubuntu:~$ sqlite3 test.db
-- Loading resources from /home/myqiao/.sqliterc
SQLite version 3.7.4
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
sqlite> 

向上面这样,我们就在终端中创建了一个 test.db 数据库, 并且通过 .tables 命令查询数据库中的表,结果没有任何返回, 因为数据库本来就是空的嘛。

下面我们创建一个 Student 表,其中包含 Id、Name、Age 等字段.

sqlite> 
sqlite> CREATE TABLE Students(Id integer,Name text,age integer);
sqlite> .tables
Students
sqlite> .schema Students
CREATE TABLE Students(Id integer,Name text,age integer);
sqlite> 

向上面这样,一个 Students 表就被建立了,这回再运行 .tables 命令就有响应了, 系统告诉我们数据库中现在有一个 Students 表, 运行 .schema 命令,返回了我们创建这个表的 SQL 命令。

四、修改表 ALTER TABLE

SQLite 仅仅支持 ALTER TABLE 语句的一部分功能, 我们可以用 ALTER TABLE 语句来更改一个表的名字,也可向表中增加一个字段(列), 但是我们不能删除一个已经存在的字段,或者更改一个已经存在的字段的名称、数据类型、限定符等等。

  • 改变表名 - ALTER TABLE 旧表名 RENAME TO 新表名
  • 增加一列 - ALTER TABLE 表名 ADD COLUMN 列名 数据类型 限定符

下面我们来演示一下,将前面的 Students 表的名字改为 Teachers

sqlite> 
sqlite> .tables
Students
sqlite> ALTER TABLE Students RENAME TO Teachers;
sqlite> .tables
Teachers
sqlite> 

原来数据库中只有一个 Students 表,改名以后再运行 .tables 命令,发现 Students 表已经没了,现在变成了 Teachers 表。

下面改变 Teachers 表的结构,增加一个 Sex 列

sqlite> 
sqlite> .schema Teachers
CREATE TABLE "Teachers"(Id integer,Name text,age integer);
sqlite> ALTER TABLE Teachers ADD COLUMN Sex text;
sqlite> .schema Teachers
CREATE TABLE "Teachers"(Id integer,Name text,age integer, Sex text);
sqlite> 

五、删除表 DROP TABLE

删除一个表很简单,只要给出表名即可

  • 删除表 - DROP TABLE 表名

下面,我们将 test.db 中的 Teachers 表删除

sqlite> 
sqlite> .tables
Teachers
sqlite> DROP TABLE Teachers;
sqlite> .tables
sqlite> 

删除 Teachers 表后再运行 .tables 命令,发现数据库已经空了。

六、后续内容

其实创建一个表远没有这么简单,表的每一列可以有很多限定符,比如主列、非空、限制、默认值、唯一、键等等,这些内容留到下一篇吧


//===================================================================================================
posted on 2011-07-12 00:04 左洸 阅读(3728) 评论(18) 编辑 收藏

FeedBack:
2011-07-12 08:10 | 桀骜的灵魂      
想问问SQlite对比MSSQL,MySQL等的传统数据库有什么优势?
 回复 引用 查看   
2011-07-12 09:01 | 火星大能猫      
@桀骜的灵魂
sqlite就像accsess一样,直接以文件形式保存,无需安装客户端,像iphone的联系人,短信就是sqlite格式保存的.我更关心的是sqlite跟access相比哪个更有优势.

 回复 引用 查看   
2011-07-12 09:29 | john23.net      
顶个
 回复 引用 查看   
2011-07-12 10:50 | 桀骜的灵魂      
@火星大能猫
3Q

 回复 引用 查看   
2011-07-12 11:06 | eflay      
@火星大能猫
能用access数据库不需要客户端是因为有odbc access而已,而SQLite是只要带个库就行了,不一样。

 回复 引用 查看   
2011-07-12 11:17 | 秋雨      
@火星大能猫
相对于Access,sqlite有System.Data.SQLite.DLL这么个类库,他继承了ado.net,你可以像操作ms sql一样去操作sqlite.
而access好像要依赖于office 的com组件.
sqlite对事务有很好的支持.在性能上较access有很大的提高.
虽然access也支持事务,不过那事务好像是假的.在成倍的增长数据,所用的时候也是成倍增加,而sqlite是一个线性的增加.

 回复 引用 查看   
2011-07-12 11:29 | IT鸟      
性能比较 有没结果的?
 回复 引用 查看   
#8楼[楼主]
2011-07-12 12:12 | 左洸      
SQLite 是自持的、无服务器的、可内置的、跨平台的、小型数据库引擎
 回复 引用 查看   
2011-07-12 13:53 | 吖龙      
期待这一系列··lz加油
 回复 引用 查看   
2011-07-12 16:29 | A_明~坚持      
有必要这么做吗?很麻烦,我操作sqllite一般都用visual studio,在visual studio中添加上引用一些sqllite类之后,就和安装了一个sqllite查询分析器一样操作sqllite,多好啊!
 回复 引用 查看   
2011-07-12 17:22 | BinBeck      
引用A_明~坚持:有必要这么做吗?很麻烦,我操作sqllite一般都用visual studio,在visual studio中添加上引用一些sqllite类之后,就和安装了一个sqllite查询分析器一样操作sqllite,多好啊!

噢?愿听其详。怎么引用,哪些类?如何做查询操作,有空共享一下。

 回复 引用 查看   
2011-07-12 17:31 | BinBeck      
sqlite比access好很多,两点就够了 access不支持多条语句的存储过程 access在64位系统下要安装合适的64位驱动挺烦人。而这些sqlite都没有问题。
 回复 引用 查看   
2011-07-13 07:46 | 桀骜的灵魂      
@BinBeck
我昨天下午,很认真的尝试把SQLite结合NHibernate 3.0来试试,但失败,不知道什么原因,总提示一个错误。
引用Make sure "System.Data.SQLite.SR.resources" was correctly embedded or linked into assembly "System.Data.SQLite" at compile time, or that all the satellite assemblies required are loadable and fully signed.


有没人遇过?

 回复 引用 查看   
2011-07-16 17:13 | 永远的阿哲      
那我用varchar(255)作为其数据类型,为何没什题?
 回复 引用 查看   
#15楼[楼主]
2011-07-17 12:33 | 左洸      
引用永远的阿哲:那我用varchar(255)作为其数据类型,为何没什题?

sqlite 的数据类型很灵活,甚至你可以不声明数据类型,varchar(255)当然也可以

 回复 引用 查看   
2011-07-18 22:26 | A_明~坚持      
@BinBeck
有好多软件可以操作sqllite,但用过之后都感觉没有visual studio好用。
前些日子用C#写了一个winform的客户端程序,开始用xml,但后来看见sqllite之后就来了兴趣,把以前用xml编写类全部推翻,重新给sqllite编写了操作类,感觉挺好用的, 轻量级,实在是轻,感觉无负荷,而且操作起来速度要快很多,至少sql、oracle是赶不上,但是有一点不爽的就是对datetime类型的操作有限制!可以找找我的博客我写过一篇用visual studio部署sqllite的入门文章,凑合看吧,文笔较差.

 回复 引用 查看   
2011-07-18 22:50 | A_明~坚持      
@秋雨
sqllite是线性的存储????
从sqllite原始数据文件看,感觉他采用的是B树才对,树是典型的非线性结构,怎么是线性的,可否解释?

 回复 引用 查看   
2011-10-10 21:05 | 蔡迅      
在程序中使用SQL语句创建数据表时,如何判断表是否存在呢?因为以往我们在使用mssql或mysql时创建表都会先判断,如果存在就删除再创建。
 回复 引用 查看