2014年3月6日星期四

SQLite之数据插入、更新和删除

本节内容如何向SQLite表中插入,更新和删除数据。实现这些操作的SQL语句分别为INSERT,UPDATEDELETE。这些语句是SQL数据操作语言(DML)中的一部分。

插入数据

INSERT语句用于向表中插入数据。我们这里有一个已经创建好的表Books,先看看创建这个表的SQL语句结构和表中的数据。
1
2
3
4
5
6
7
8
sqlite> .schema Books
CREATE TABLE Books(Id integer PRIMARY KEY,Title text,Author text,
Isbn text default 'not available');
sqlite> SELECT * FROM Books;
Id|Title|Author|Isbn
1|C Primer Plus|Stephen Prata|978-7-115-13022-8/TP
2|鸟哥的Linux私房菜|鸟哥|978-7-115-22626-6
3|OpenGL编程指南|Dave Shreiner|978-7-111-29450-4
表Books有四列,字段名分别为Id,Title,Autor和Isbn,其中Id定义为INTEGER PRIMARY kEY,这表示Id为主键,其值是唯一标示一行数据的,同时Id的值是自动增加的,这意味着SQLite库为增加一个新的Id。
1
2
3
4
5
6
7
8
sqlite> INSERT INTO Books(Id,Title,Author,Isbn)
   ...> VALUES(4,'Visual C++程序开发','明日科技','978-7-115-20107-2');     
sqlite> SELECT * FROM Books;
Id|Title|Author|Isbn
1|C Primer Plus|Stephen Prata|978-7-115-13022-8/TP
2|鸟哥的Linux私房菜|鸟哥|978-7-115-22626-6
3|OpenGL编程指南|Dave Shreiner|978-7-111-29450-4
4|Visual C++程序开发|明日科技|978-7-115-20107-2
上面我们向表Books插入一行新的数据。
1
2
3
4
5
6
7
8
9
sqlite> INSERT INTO Books(Title,Author,Isbn)
   ...> VALUES('21天学通Linux C编程','马玉军等','978-7-12110622-4');
sqlite> SELECT * FROM Books;
Id|Title|Author|Isbn
1|C Primer Plus|Stephen Prata|978-7-115-13022-8/TP
2|鸟哥的Linux私房菜|鸟哥|978-7-115-22626-6
3|OpenGL编程指南|Dave Shreiner|978-7-111-29450-4
4|Visual C++程序开发|明日科技|978-7-115-20107-2
5|21天学通Linux C编程|马玉军等|978-7-12110622-4
这里我们向表中插入一行新的数据,但我们没有指定Id的值,可以看到没指定Id的值时,Id的值是自动递增的。
1
2
3
4
5
6
7
8
9
sqlite> INSERT INTO Books VALUES(6,'PHP开发宝典','刘欣等','978-7-111-38093-1');
sqlite> SELECT * FROM Books;
Id|Title|Author|Isbn
1|C Primer Plus|Stephen Prata|978-7-115-13022-8/TP
2|鸟哥的Linux私房菜|鸟哥|978-7-115-22626-6
3|OpenGL编程指南|Dave Shreiner|978-7-111-29450-4
4|Visual C++程序开发|明日科技|978-7-115-20107-2
5|21天学通Linux C编程|马玉军等|978-7-12110622-4
6|PHP开发宝典|刘欣等|978-7-111-38093-1
上面的插入语句我们在表名后没有指定任何列名。在这种情况下我们需要指定所有的列值。
1
sqlite> .nullvalue NULL
.nullvalue NULL告诉SQLite以NULL代表空值。所以SQLite默认情况下以NULL代替空字符串。
1
2
3
4
5
6
7
8
9
10
11
sqlite> .nullvalue NULL
sqlite> INSERT INTO Books(Id,Title) VALUES(7,'红高粱');
sqlite> SELECT * FROM Books;
Id|Title|Author|Isbn
1|C Primer Plus|Stephen Prata|978-7-115-13022-8/TP
2|鸟哥的Linux私房菜|鸟哥|978-7-115-22626-6
3|OpenGL编程指南|Dave Shreiner|978-7-111-29450-4
4|Visual C++程序开发|明日科技|978-7-115-20107-2
5|21天学通Linux C编程|马玉军等|978-7-12110622-4
6|PHP开发宝典|刘欣等|978-7-111-38093-1
7|红高粱|NULL|not available
上面SQL插入语句省略了后两个列值。这些列会被默认值或NULL填充。Author列没有默认值,因此以NULL替代。我们在创建表时指定Isbn列的默认值为'not available',因此这里会用该值来替代。
1
2
3
4
5
6
7
8
9
10
11
12
13
sqlite>  INSERT INTO Books VALUES(4,'过得刚好','郭得纲','978-7-550-21422-4');
Error: PRIMARY KEY must be unique
sqlite> INSERT OR REPLACE INTO Books
   ...> VALUES(4,'过得刚好','郭得 纲','978-550-21422-4);
sqlite> SELECT * FROM Books;
Id|Title|Author|Isbn
1|C Primer Plus|Stephen Prata|978-7-115-13022-8/TP
2|鸟哥的Linux私房菜|鸟哥|978-7-115-22626-6
3|OpenGL编程指南|Dave Shreiner|978-7-111-29450-4
4|过得刚好|郭得纲|978-550-21422-4
5|21天学通Linux C编程|马玉军等|978-7-12110622-4
6|PHP开发宝典|刘欣等|978-7-111-38093-1
7|红高粱||not available
这里我们向已经存在的行插入新的数据,结果会提示错误。这是因为Id是主键,其值是唯一的,不能有重复。这种情况下我们想插入数据,可以使用INSERT OR REPLACE语句,这样可以将已经存在的行的数据进行替换,当然使用UPDATE语句也可以实现同样功能。
我们可以使用INSERT语句一次性向表中插入多行数据。下面我们创建一个表Ints,并向表中一次插入五行数据。
1
2
3
4
5
6
7
8
9
10
sqlite> CREATE TABLE Ints(Id INTEGER PRIMARY KEY,Val INTEGER);
sqlite> INSERT INTO Ints(Val) VALUES (1),(2),(3),(4),(5);
sqlite> SELECT * FROM Ints;
Id                    Val                
--------------------  --------------------
1                     1                  
2                     2                  
3                     3                  
4                     4                  
5                     5   
这是Ints表中的所有数据。
我们可以在一个SQL语句中将INSERT和SELECT语句结合起来一起使用。我们先创建一个和Books表结构一样的表Books2。
1
2
3
4
5
sqlite> .schema Books
CREATE TABLE Books(Id integer PRIMARY KEY,Title text,Author text,
Isbn text default 'not available');
sqlite> CREATE TABLE Books2(Id integer PRIMARY KEY,Title text,Author text,
Isbn text default 'not available'); 
1
2
3
4
5
6
7
8
9
10
sqlite> INSERT INTO Books2 SELECT * FROM Books;
sqlite> SELECT * FROM Books2;
Id|Title|Author|Isbn
1|C Primer Plus|Stephen Prata|978-7-115-13022-8/TP
2|鸟哥的Linux私房菜|鸟哥|978-7-115-22626-6
3|OpenGL编程指南|Dave Shreiner|978-7-111-29450-4
4|过得刚好|郭得纲|978-550-21422-4
5|21天学通Linux C编程|马玉军等|978-7-12110622-4
6|PHP开发宝典|刘欣等|978-7-111-38093-1
7|红高粱||not available
我们将Books中的所有数据插入到表Books2中。

删除数据

DELETE语句用于从表中删除数据。首先我们从表中删除一行数据。我们使用先前创建的表Books2。
1
2
3
4
5
6
7
8
9
sqlite> DELETE FROM Books2 WHERE Id = 2;
sqlite> SELECT * FROM Books2;
Id|Title|Author|Isbn
1|C Primer Plus|Stephen Prata|978-7-115-13022-8/TP
3|OpenGL编程指南|Dave Shreiner|978-7-111-29450-4
4|过得刚好|郭得纲|978-550-21422-4
5|21天学通Linux C编程|马玉军等|978-7-12110622-4
6|PHP开发宝典|刘欣等|978-7-111-38093-1
7|红高粱||not available
我们将Id为2的行删除。查看表中的所有数据,第二行数据已经被删除。
1
sqlite> DELETE FROM Books2;
该语句将表中的所有数据删除。

更新数据

UPDATE语句用于修改表中指定行的列值。如果我们想将Books表中的'郭德纲'改为'于谦',我们可以使用下面的语句来实现。
1
2
3
4
sqlite> UPDATE Books SET Author='于谦' WHERE Id = 4;
sqlite> SELECT * FROM Books WHERE Id = 4 ;
Id|Title|Author|Isbn
4|过得刚好|于谦|978-550-21422-4
可以看出Id为4的行中列Author的数据已经被成功修改。
这一节我们主要介绍如何向表中插入、删除和修改数据。

没有评论: