`
jiasongmao
  • 浏览: 648008 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

SQLite学习手册(数据表和视图)

 
阅读更多

一、创建数据表:

    该命令的语法规则和使用方式与大多数关系型数据库基本相同,因此我们还是以示例的方式来演示SQLite中创建表的各种规则。但是对于一些SQLite特有的规则,我们会给予额外的说明。注:以下所有示例均是在sqlite自带命令行工具中完成的。
    1). 最简单的数据表:
    sqlite> CREATE TABLE testtable (first_col integer);
    这里需要说明的是,对于自定义数据表表名,如testtable,不能以sqlite_开头,因为以该前缀定义的表名都用于sqlite内部。

    2). 创建带有缺省值的数据表:
    sqlite> CREATE TABLE testtable (first_col integer DEFAULT 0, second_col varchar DEFAULT 'hello');

    3). 在指定数据库创建表:
    sqlite> ATTACH DATABASE 'd:/mydb.db' AS mydb;
    sqlite> CREATE TABLE mydb.testtable (first_col integer);
    这里先通过ATTACH DATABASE命令将一个已经存在的数据库文件attach到当前的连接中,之后再通过指定数据库名的方式在目标数据库中创建数据表,如mydb.testtable。关于该规则还需要给出一些额外的说明,如果我们在创建数据表时没有指定数据库名,那么将会在当前连接的main数据库中创建该表,在一个连接中只能有一个main数据库。如果需要创建临时表,就无需指定数据库名,见如下示例:
    --创建两个表,一个临时表和普通表。
    sqlite> CREATE TEMP TABLE temptable(first_col integer);
    sqlite> CREATE TABLE testtable (first_col integer);    
    --将当前连接中的缓存数据导出到本地文件,同时退出当前连接。
    sqlite> .backup d:/mydb.db
    sqlite> .exit
    --重新建立sqlite的连接,并将刚刚导出的数据库作为主库重新导入。
    sqlite> .restore d:/mydb.db
    --查看该数据库中的表信息,通过结果可以看出临时表并没有被持久化到数据库文件中。
    sqlite> .tables
    testtable   

    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> .schema testtable2
    CREATE TABLE testtable2(first_col INT);
    .schema命令是sqlite3命令行工具的内置命令,用于显示当前数据表的CREATE TABLE语句。   

    6). 主键约束:
    --直接在字段的定义上指定主键。
    sqlite> CREATE TABLE testtable (first_col integer PRIMARY KEY ASC);
    --在所有字段已经定义完毕后,再定义表的数约束,这里定义的是基于first_col和second_col的联合主键。
    sqlite> CREATE TABLE testtable2 (
       ...>     first_col integer,
       ...>     second_col integer,
       ...>     PRIMARY KEY (first_col,second_col)
       ...> );
    和其他关系型数据库一样,主键必须是唯一的。

    7). 唯一性约束:
    --直接在字段的定义上指定唯一性约束。
    sqlite> CREATE TABLE testtable (first_col integer UNIQUE);
    --在所有字段已经定义完毕后,在定义表的唯一性约束,这里定义的是基于两个列的唯一性约束。
    sqlite> CREATE TABLE testtable2 (
       ...>     first_col integer,
       ...>     second_col integer,
       ...>     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);
    sqlite> SELECT count(*) FROM testtable;
    count(*)
    ----------
    2    
    由此可见,两次插入的NULL值均插入成功。

    8). 为空(NOT NULL)约束:
    sqlite> CREATE TABLE testtable(first_col integer NOT NULL);
    sqlite> INSERT INTO testtable VALUES(NULL);
    Error: testtable.first_col may not be NULL
    从输出结果可以看出,first_col已经被定义了非空约束,因此不能在插入NULL值了。   

    9). 检查性约束:
    sqlite> CREATE TABLE testtable (first_col integer CHECK (first_col < 5));
    sqlite> INSERT INTO testtable VALUES(4);
    sqlite> INSERT INTO testtable VALUES(20); -- 20违反了字段first_col的检查性约束(first_col < 5)
    Error: constraint failed
    --和之前的其它约束一样,检查性约束也是可以基于表中的多个列来定义的。    
    sqlite> CREATE TABLE testtable2 (
       ...>     first_col integer,
       ...>     second_col integer,
       ...>     CHECK (first_col > 0 AND second_col < 0)
       ...> );

二、表的修改:

    SQLite对ALTER TABLE命令支持的非常有限,仅仅是修改表名和添加新字段。其它的功能,如重命名字段、删除字段和添加删除约束等均为提供支持。
    1). 修改表名:
    需要先说明的是,SQLite中表名的修改只能在同一个数据库中,不能将其移动到Attached数据库中。再有就是一旦表名被修改后,该表已存在的索引将不会受到影响,然而依赖该表的视图和触发器将不得不重新修改其定义。
    sqlite> CREATE TABLE testtable (first_col integer);
    sqlite> ALTER TABLE testtable RENAME TO testtable2;
    sqlite> .tables
    testtable2    
    通过.tables命令的输出可以看出,表testtable已经被修改为testtable2。   

    2). 新增字段:
    sqlite> CREATE TABLE testtable (first_col integer);
    sqlite> ALTER TABLE testtable ADD COLUMN second_col integer;
    sqlite> .schema testtable
    CREATE TABLE "testtable" (first_col integer, second_col integer);    
    通过.schema命令的输出可以看出,表testtable的定义中已经包含了新增字段。   
    关于ALTER TABLE最后需要说明的是,在SQLite中该命令的执行时间是不会受到当前表行数的影响,也就是说,修改有一千万行数据的表和修改只有一条数据的表所需的时间几乎是相等的。
   
三、表的删除:

    在SQLite中如果某个表被删除了,那么与之相关的索引和触发器也会被随之删除。在很多其他的关系型数据库中是不可以这样的,如果必须要删除相关对象,只能在删除表语句中加入WITH CASCADE从句。见如下示例:
    sqlite> CREATE TABLE testtable (first_col integer);
    sqlite> DROP TABLE testtable;
    sqlite> DROP TABLE testtable;
    Error: no such table: testtable
    sqlite> DROP TABLE IF EXISTS testtable;    
    从上面的示例中可以看出,如果删除的表不存在,SQLite将会报错并输出错误信息。如果希望在执行时不抛出异常,我们可以添加IF EXISTS从句,该从句的语义和CREATE TABLE中的完全相同。
    
四、创建视图:

    我们这里只是给出简单的SQL命令示例,具体的含义和技术细节可以参照上面的创建数据表部分,如临时视图、"IF NOT EXISTS"从句等。
    1). 最简单的视图:
    sqlite> CREATE VIEW testview AS SELECT * FROM testtable WHERE first_col > 100;    
    
    2). 创建临时视图:
    sqlite> CREATE TEMP VIEW tempview AS SELECT * FROM testtable WHERE first_col > 100;
    
    3). "IF NOT EXISTS"从句:
    sqlite> CREATE VIEW testview AS SELECT * FROM testtable WHERE first_col > 100;
    Error: table testview already exists
    sqlite> CREATE VIEW IF NOT EXISTS testview AS SELECT * FROM testtable WHERE first_col > 100;
   
五、删除视图:

    该操作的语法和删除表基本相同,因此这里只是给出示例:
    sqlite> DROP VIEW testview;
    sqlite> DROP VIEW testview;
    Error: no such view: testview
    sqlite> DROP VIEW IF EXISTS testview; 

分享到:
评论

相关推荐

    SQLite学习手册(带目录)

    SQLite学习手册(数据表和视图) 一、创建数据表 二、表的修改 三、表的删除 四、创建视图 五、删除视图 SQLite学习手册(内置函数) 一、聚合函数 二、核心函数 三、日期和时间函数 SQLite学习手册(索引和数据分析/清理...

    SQLite参考手册.CHM

    教程,安装,命令,语法,数据类型,创建数据库,附加数据库,分离数据库,创建表,删除表,insert语句,select语句,运算符,表达式,where子句,and/or运算符,update子句,like, group,limit, order by, having ...

    Navicat Premium操作手册.7z

    4PostgreSQL 触发器99PostgreSQL 触发函数100PostgreSQL 类型102...表选项112SQLite 视图112SQLite 索引113SQLite 触发器114SQL Server 对象115SQL Server 备份或还原(只限于完整版本)120SQL Server 备份120...

    python数据分析随书代码

    2.7 创建数组的视图和拷贝 40 2.8 花式索引 41 2.9 基于位置列表的索引方法 43 2.10 用布尔型变量索引NumPy数组 44 2.11 NumPy数组的广播 46 2.12 小结 49 第3章 统计学与线性代数 50 3.1 Numpy和Scipy模块 ...

    php网络开发完全手册

    2.7.1 使用require和require_once语句 2.7.1 进行文件包含 42 2.7.2 使用include与include_once语句 2.7.2 进行文件包含 44 2.8 小结 45 第3章 PHP的数据类型与操作 46 3.1 数据类型的介绍 46 3.1.1 标量数据类型 46...

    padrino-note:基于 Sinatra 的 Padrino Web 框架学习笔记

    目录相关链接参考资料通用(General)基础(Basic)模型(Model)Active Record基础SQLite数据类型Active Record数据关系Active Record数据查询视图(View)Bootstrap手册控制器(Controller)Padrino控制器工具(Tool)Padrino...

    SQL必知必会 超清完整版 附带书签

    本书由浅入深地讲解了 SQL 的基本概念和语法, 涉及数据的排序、 过滤和分组, 以及表、视图、 联结、 子查询、 游标、 存储过程和触发器等内容, 实例丰富, 便于查阅。 SQL语法简洁,使用方式灵活,功能强大,...

    vbRichClient控件cTCPClient使用例程 (让vb的winsock.ocx滚蛋)

    说明: ...因此程序可以说是网上...vbRichClient5的手册找遍了都找不到,估计作者都没写,更别想有中文版了,所以只能 在vb6中点击视图-》对象窗口,可显示vbRichClient5.dll 所有的类和方法 QQ175891641 2018-2-15优化

    asp.net知识库

    根据基本表结构及其数据生成 INSERT ... 的 SQL 简便的MS SQL 数据库 表内容 脚本 生成器 将表数据生成SQL脚本的存储过程 直接从SQL语句问题贴子数据建表并生成建表语句的存储过程 从SQL中的一个表中导出HTML文件...

    ZendFramework中文文档

    10.4.2. 同一表中查询多列数据 10.4.3. 多表联合查询 10.4.4. WHERE条件 10.4.5. GROUP BY分句 10.4.6. HAVING 条件 10.4.7. ORDER BY 分句 10.4.8. 通过总数和偏移量进行LIMIT限制 10.4.9. 通过页数和总数...

    android开发资料大全

    Android入门逆引手册 Android开发指南中文版、创意设计 【Android系统原理与开发要点详解】/底层 应用 框架 Android核心分析28篇,强烈推荐android初学者,android进阶者看看这个系列教程 Android应用开发者指南:...

Global site tag (gtag.js) - Google Analytics