菜单

SQLite教程(三):数据表和视图简介

2018年11月16日 - sqlite

复制代码 代码如下:

    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值均插入成功。

    sqlite> CREATE TABLE testtable2 AS SELECT * FROM testtable;   
    sqlite> .schema testtable2
    CREATE TABLE testtable2(first_col INT);
 

    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语句。   

    sqlite> CREATE TEMP TABLE temptable(first_col integer);
    sqlite> CREATE TABLE testtable (first_col integer);   
 

  
 该令的语法规则与行使方式与大多数关乎项目数据库基本相同,因此我们或坐示范的主意来演示SQLite中创造建表的各种条条框框。但是对于有些SQLite特有的规则,我们会予以格外的求证。注:以下有所示例均是在sqlite自带命令行工具中完成的。
    1). 最简便易行的数据表:
    sqlite> CREATE TABLE testtable
(first_col integer);
  
 这里需要验证的凡,对于自定义数据表表名,如testtable,不克为sqlite_起,因为坐该前缀定义之表名都用于sqlite内部。

复制代码 代码如下:

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

    –重新成立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中的完全相同。
    
季、创建视图:

    2). 新增字段:
 

    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   

复制代码 代码如下:

  
 我们这里只是被来简约的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;
   
五、删除视图:

仲、表的改:

    6). 主键约束:
  
 –直接当字段的概念及指定主键。

    sqlite> CREATE TABLE testtable
(first_col integer PRIMARY KEY ASC);
  
 –在享有字段已经定义了后,再定义表的数约,这里定义之是因first_col和second_col的一路主键。

    sqlite> CREATE TABLE testtable2
(
       …>     first_col integer,

    3). “IF NOT EXISTS”从句:
 

       …>     second_col
integer,
       …>     PRIMARY KEY
(first_col,second_col)
       …> );
    和另涉嫌项目数据库一样,主键必须是唯一的。

    sqlite> ATTACH DATABASE ‘d:/mydb.db’ AS mydb;
    sqlite> CREATE TABLE mydb.testtable (first_col integer);
 

    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)
       …> );

复制代码 代码如下:

    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值了。   

    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。   

复制代码 代码如下:


一、创建数据表:

   
在SQLite中如有表被剔除了,那么与之相关的目和触发器也会见吃随即删除。在无数另的涉嫌项目数据库被凡是勿可以这样的,如果要使抹相关对象,只能在剔除表语句被进入WITH
CASCADE从句。见如下示例:
 

    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);

复制代码 代码如下:

    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中该令的实施时间是无见面蒙当前表行数之影响,也就是说,修改有一千万尽数据的表和修改单独发平等长条数据的表所需的时间几乎是相等的。

   
其三、表底勾:

复制代码 代码如下:

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

    .schema命令是sqlite3命令行工具的放命令,用于展示当前数据表的CREATE
TABLE语句。   

仲、表的改:

复制代码 代码如下:

    8). 为空(NOT NULL)约束:
 

    4). “IF NOT EXISTS”从句:
   
如果手上创造的数表名已经有,即与曾有的表名、视图名和索引名冲突,那么本次创建操作以破产并报错。然而一旦以创建表时加上”IF
NOT
EXISTS”从句,那么本次创建操作以未会见发出其它影响,即未见面生出误抛来,除非当前的表名和某某平等寻找引名冲突。
 

复制代码 代码如下:

    3). 在指定数据库创建表:
 

君可能感兴趣的篇章:

    2). 创建带有缺省值的数据表:
 

    sqlite> .tables
    testtable   

复制代码 代码如下:

    sqlite> DROP VIEW testview;
    sqlite> DROP VIEW testview;
    Error: no such view: testview
    sqlite> DROP VIEW IF EXISTS testview;      

    sqlite> CREATE VIEW testview AS SELECT * FROM testtable WHERE
first_col > 100;   
   

    7). 唯一性约束:
 

    sqlite> CREATE TEMP VIEW tempview AS SELECT * FROM testtable
WHERE first_col > 100;
   

    5). CREATE TABLE … AS SELECT:
   
通过该办法开创的数码表将与SELECT查询返回的结果集有相同的Schema信息,但是非分包缺省值和主键等自律信息。然而新创造的表将会包含结果集返回的保有数据。
 

    sqlite> CREATE TABLE testtable (first_col integer);
    sqlite> ALTER TABLE testtable RENAME TO testtable2;
    sqlite> .tables
    testtable2   
 

    SQLite对ALTER
TABLE命令支持的异常少,仅仅是改表名和添加新字段。其它的功效,如重命名字段、删除字段和丰富删减约束等全为提供支撑。

    sqlite> CREATE TABLE testtable (first_col integer DEFAULT 0,
second_col varchar DEFAULT ‘hello’);

    –直接在字段的定义及指定唯一性约束。
    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  
 

    该操作的语法和删除表基本相同,因此此只是让出示例:
 

复制代码 代码如下:

    sqlite> .backup d:/mydb.db
    sqlite> .exit
 

    这里先经过ATTACH
DATABASE命令将一个既存在的数据库文件attach到当下的连日着,之后又经过点名数量库名的方于靶数据库中创造数据表,如mydb.testtable。关于该规则还需要给出部分分外的说明,如果我们当开创数量表时没有点名数量库名,那么以会晤以此时此刻连日的main数据库被开创该表,在一个连续着不得不有一个main数据库。如果急需创造临时表,就不管需点名数量库名,见如下示例:
    –创建两单说明,一个临时表和普通表。
 

   
从输出结果可以看出,first_col已经被定义了非空约束,因此无克于插入NULL值了。   

    9). 检查性约束:
 

    sqlite> CREATE TABLE testtable(first_col integer NOT NULL);
    sqlite> INSERT INTO testtable VALUES(NULL);
    Error: testtable.first_col may not be NULL
 

   
该令的语法规则和采取方法同大部分涉项目数据库基本相同,因此我们要坐示范的方式来演示SQLite中创造建表的各种条条框框。但是对有些SQLite特有的平整,我们会予以格外的认证。注:以下有所示例均是于sqlite自带命令行工具中落成的。

复制代码 代码如下:

复制代码 代码如下:

    2). 创建临时视图:
 

复制代码 代码如下:

五、删除视图:

    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> .restore d:/mydb.db
 

    1). 最简单易行的数据表:
 

复制代码 代码如下:

    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 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);
 

   
这里要说明的凡,对于自定义数据表表名,如testtable,不可知盖sqlite_起,因为坐该前缀定义之表名都用来sqlite内部。

   
–查看该数据库中的表明信息,通过结果可以看出临时表并没叫持久化到数据库文件被。
 

   
我们这里只是为来简约的SQL命令示例,具体的义和技术细节可以参照者的创立数据表部分,如现视图、”IF
NOT EXISTS”从句等。
    1). 最简便的视图:
 

一律、创建数据表:

    6). 主键约束:
 

    由此可见,两次于栽的NULL值均插入成功。

   
通过.tables命令的输出可以见见,表testtable已经让涂改为testtable2。   

    1). 修改表名:

   
需要先证实的凡,SQLite中表名的改动才会于与一个数据库被,不可知拿该动到Attached数据库中。再发就是是要表名被修改后,该表已是的目将非见面被震慑,然而因该表的视图和触发器将不得不重新修改其定义。
 

复制代码 代码如下:

    –将眼前接连着之缓存数据导出到本地文件,同时离时连连。
 

复制代码 代码如下:

复制代码 代码如下:

复制代码 代码如下:

   
从地方的以身作则中得望,如果除去的阐明不存,SQLite将会晤报错并出口错误信息。如果希望在实行时无废除来好,我们得以添加IF
EXISTS从句,该起句的语义和CREATE TABLE中之完全相同。
   
季、创建视图:

    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> CREATE TABLE testtable (first_col integer);
 

    –直接当字段的概念及点名主键。
    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)
       …> );

   
通过.schema命令的输出可以看到,表testtable的概念着既包含了新加字段。   
    关于ALTER
TABLE最后用证实的是,在SQLite中该令的执行时是不会见受当前表行数的熏陶,也就是说,修改有一千万实践数据的表和修改单独生一致长达数的表所需的年华几乎是等的。
   
其三、表底删减:

复制代码 代码如下:

    和其它涉嫌项目数据库一样,主键必须是唯一的。

相关文章

标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图