ZetCode

SQLite 插入、更新、删除数据

最后修改于 2020 年 7 月 6 日

在本 SQLite 教程中,我们将从 SQLite 表中插入、更新和删除数据。我们将使用 INSERTDELETEUPDATE 语句。这些语句是 SQL 数据操作语言 (DML) 的一部分。

SQLite 插入数据

INSERT 语句用于将数据插入表中。我们将创建一个新表来执行我们的示例。

sqlite> DROP TABLE IF EXISTS Cars;
sqlite> CREATE TABLE Cars(Id INTEGER PRIMARY KEY, Name TEXT,
   ...> Price INTEGER DEFAULT 'Not available');

我们创建一个新表 Cars,其中包含 IdNamePrice 列。

sqlite> INSERT INTO Cars(Id, Name, Price) VALUES(1, 'Audi', 52642);

这是经典的 INSERT 语句。我们在表名后指定了所有列名,在 VALUES 关键字后指定了所有值。第一行被添加到表中。

sqlite> INSERT INTO Cars(Name, Price) VALUES('Mercedes', 57127);

我们向 Cars 表中添加一辆新车。我们省略了 Id 列。Id 列定义为 INTEGER PRIMARY KEY,此类列在 SQLite 中是自动递增的。这意味着 SQLite 库本身将添加一个新的 Id

sqlite> .headers on
sqlite> SELECT * FROM Cars;
Id|Name|Price
1|Audi|52642
2|Mercedes|57127

这是我们目前在 Cars 表中的内容。

sqlite> INSERT INTO Cars VALUES(3, 'Skoda', 9000);

在此 SQL 语句中,我们没有在表名后指定任何列名。在这种情况下,我们必须提供所有值。

sqlite> .nullvalue NULL

.nullvalue 命令告诉 SQLite 将 NULL 值显示为 NULL。默认情况下,SQLite 为 NULL 值显示空字符串。

sqlite> INSERT INTO Cars(Id) VALUES(4);

INSERT 语句省略了最后 2 列。此类列将填充默认值,如果没有默认值,则填充 NULLName 列没有默认值,因此有一个 NULL 值。在 CREATE TABLE 语句中,我们指定了 Price 列具有“Not available”默认值。

sqlite> SELECT * FROM Cars WHERE Id=4;
Id|Name|Price
4|NULL|Not available

在第二列中,我们有一个 NULL 值。第三列有默认值“Not available”字符串。

sqlite> INSERT INTO Cars VALUES(4, 'Volvo', 29000);
Error: UNIQUE constraint failed: Cars.Id

假设我们想将所有信息放入第四列。尝试将新数据插入到现有行会产生以下错误:UNIQUE constraint failed: Cars.Id

sqlite> INSERT OR REPLACE INTO Cars VALUES(4, 'Volvo', 29000);

在这种情况下,我们可以使用 INSERT OR REPLACE 语句。这也可以通过 UPDATE 语句完成。

sqlite> SELECT * FROM Cars WHERE Id=4;
Id|Name|Price
4|Volvo|29000 

现在我们在第四行中拥有所有信息。

sqlite> INSERT OR FAIL INTO Cars VALUES(4, 'Bentley', 350000);
Error: UNIQUE constraint failed: Cars.Id

INSET OR FAIL INTO 语句等于 INSERT INTO 语句。它只是更具体地说明如果发生错误,它将失败。

sqlite> INSERT OR IGNORE INTO Cars VALUES(4, 'Bentley', 350000);
sqlite> SELECT * FROM Cars WHERE Id=4;
Id|Name|Price
4|Volvo|29000

INSERT OR IGNORE INTO 语句忽略错误消息。SELECT 语句显示最后两个语句没有修改第四行。

自 SQLite 版本 3.7.11 起,可以使用一个 INSERT 语句插入多行。

sqlite> CREATE TEMP TABLE Ints(Id INTEGER PRIMARY KEY, Val INTEGER);

我们将使用单列 Ints 表来显示多行 INSERT 语句。该表的唯一列存储整数。

sqlite> INSERT INTO Ints(Val) VALUES (1), (3), (5), (6), (7), (8), (6), (4), (9);

我们一次将九行插入到表中。这些行位于 VALUES 关键字之后,并由逗号分隔。

sqlite> SELECT * FROM Ints;
Id|Val
1|1
2|3
3|5
4|6
5|7
6|8
7|6
8|4
9|9

这是 Ints 表的内容。

我们可以一起使用 INSERTSELECT 语句。

sqlite> CREATE TABLE Cars2(Id INTEGER PRIMARY KEY, Name TEXT, Price INTEGER);

首先,我们创建一个名为 Cars2 的新表。

sqlite> INSERT INTO Cars2 SELECT * FROM Cars;

在这里,我们将所有数据从 Cars 表插入到 Cars2 表中。

sqlite> SELECT * FROM Cars2;
Id|Name|Price
1|Audi|52642
2|Mercedes|57127
3|Skoda|9000
4|Volvo|29000

我们验证一下。

SQLite 删除数据

DELETE 关键字用于从表中删除数据。首先,我们将从表中删除一行。我们将使用之前创建的 Cars2 表。

sqlite> DELETE FROM Cars2 WHERE Id=1;

我们删除 Id 为 1 的行。

sqlite> SELECT * FROM Cars2;
Id|Name|Price
2|Mercedes|57127
3|Skoda|9000
4|Volvo|29000

我们验证第一行是否缺失。

sqlite> DELETE FROM Cars2;

此 SQL 语句删除表中的所有数据。

sqlite> SELECT Count(Id) AS '# of cars' FROM Cars2;
# of cars      
---------------
0  

此 SQL 语句确认 Cars2 表中现在没有行。

sqlite> .read cars.sql
sqlite> SELECT * FROM Cars;
1|Audi|52642
2|Mercedes|57127
3|Skoda|9000
4|Volvo|29000
5|Bentley|350000
6|Citroen|21000
7|Hummer|41400
8|Volkswagen|21600

使用 .read 元命令,我们创建一个新的 Cars 表。(该表的 SQL 可以在本教程的第一章中找到。)

SQLite 更新数据

UPDATE 语句用于修改存储在数据库表中的零行或多行中的值的子集。

假设我们想在 Cars 表中将“Skoda”更改为“Skoda Octavia”。以下语句显示了如何完成此操作

sqlite> .read cars.sql
sqlite> UPDATE Cars SET Name='Skoda Octavia' WHERE Id=3;

SQL 语句将汽车的名称设置为“Skoda Octavia”,对于 Id=3 的列。

sqlite> SELECT * FROM Cars WHERE Id=3;
3|Skoda Octavia|9000

该行已正确更新。

在本 SQLite 教程中,我们已在数据库表中插入、删除和更新了数据。