一、创建数据表:
该命令的语法规则和使用方式与大多数关系型数据库基本相同,因此我们还是以示例的方式来演示SQLite中创建表的各种规则。但是对于一些SQLite特有的规则,我们会给予额外的说明。注:以下所有示例均是在sqlite自带命令行工具中完成的。
1). 最简单的数据表:
sqlite> CREATE TABLE testtable (first_col integer);
2). 创建带有缺省值的数据表:
sqlite> CREATE TABLE testtable (first_col integer DEFAULT 0, second_col varchar DEFAULT 'hello');
sqlite> ATTACH DATABASE 'd:/mydb.db' AS mydb; sqlite> CREATE TABLE mydb.testtable (first_col integer);
sqlite> CREATE TEMP TABLE temptable(first_col integer); sqlite> CREATE TABLE testtable (first_col integer);
sqlite> .backup d:/mydb.db sqlite> .exit
sqlite> .restore d:/mydb.db
sqlite> .tables testtable
sqlite> CREATE TABLE testtable (first_col integer); Error: table testtable already exists sqlite> CREATE TABLE IF NOT EXISTS testtable (first_col integer);
sqlite> CREATE TABLE testtable2 AS SELECT * FROM testtable; sqlite> .schema testtable2 CREATE TABLE testtable2(first_col INT);
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
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
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
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);
在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;
我们这里只是给出简单的SQL命令示例,具体的含义和技术细节可以参照上面的创建数据表部分,如临时视图、"IF NOT EXISTS"从句等。
1). 最简单的视图:
sqlite> CREATE VIEW testview AS SELECT * FROM testtable WHERE first_col > 100;
sqlite> CREATE TEMP VIEW tempview AS SELECT * FROM testtable WHERE first_col > 100;
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;