本章我们将插入,更新和删除 SQLite 表中的数据。 我们将使用INSERT
,DELETE
和UPDATE
语句。 这些语句是 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');
我们使用Id
,Name
和Price
列创建一个新表Cars
。
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
语句省略了最后两列。 这些列将填充默认值,如果没有默认值,则填充NULL
。 Name
列没有默认值,因此有一个NULL
值。 在CREATE TABLE
语句中,我们已指定Price
列具有“不可用”默认值。
sqlite> SELECT * FROM Cars WHERE Id=4;
Id|Name|Price
4|NULL|Not available
在第二列中,我们有一个NULL
值。 第三个具有默认的“不可用”字符串。
sqlite> INSERT INTO Cars VALUES(4, 'Volvo', 29000);
Error: UNIQUE constraint failed: Cars.Id
假设我们想将所有信息放入第四列。 尝试将新数据插入现有行会产生以下错误: UNIQUE 约束失败: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
表的内容。
我们可以在一个语句中同时使用INSERT
和SELECT
语句。
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
meta 命令,我们创建一个新的Cars
表。 (表的 SQL 可以在本教程的第一章中找到。)
SQLite 更新数据
UPDATE
语句用于修改存储在数据库表的零行或更多行中的值的子集。
假设我们想在Cars
表中将“斯柯达”更改为“斯柯达明锐”。 以下语句显示了如何完成此操作:
sqlite> .read cars.sql
sqlite> UPDATE Cars SET Name='Skoda Octavia' WHERE Id=3;
SQL 语句将Id=3
列的汽车名称设置为’Skoda Octavia’。
sqlite> SELECT * FROM Cars WHERE Id=3;
3|Skoda Octavia|9000
该行已正确更新。