多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# SQLite 插入,更新,删除数据 > 原文: [http://zetcode.com/db/sqlite/datamanipulation/](http://zetcode.com/db/sqlite/datamanipulation/) 在 SQLite 教程的这一部分中,我们将插入,更新和删除 SQLite 表中的数据。 我们将使用`INSERT`,`DELETE`和`UPDATE`语句。 这些语句是 SQL 数据操作语言(DML)的一部分。 ## SQLite 插入数据 `INSERT`语句用于将数据插入表中。 我们将创建一个新表来执行示例。 ```sql 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`。 ```sql sqlite> INSERT INTO Cars(Id, Name, Price) VALUES(1, 'Audi', 52642); ``` 这是经典的`INSERT`语句。 我们在表名之后指定了所有列名,并在`VALUES`关键字之后指定了所有值。 第一行添加到表中。 ```sql sqlite> INSERT INTO Cars(Name, Price) VALUES('Mercedes', 57127); ``` 我们将新车添加到`Cars`表中。 我们省略了`Id`列。 `Id`列定义为`INTEGER PRIMARY KEY`,并且这些列在 SQLite 中自动增加。 这意味着 SQLite 库本身将添加一个新的`Id`。 ```sql sqlite> .headers on sqlite> SELECT * FROM Cars; Id|Name|Price 1|Audi|52642 2|Mercedes|57127 ``` 这是目前`Cars`表中的内容。 ```sql sqlite> INSERT INTO Cars VALUES(3, 'Skoda', 9000); ``` 在此 SQL 语句中,我们没有在表名之后指定任何列名。 在这种情况下,我们必须提供所有值。 ```sql sqlite> .nullvalue NULL ``` `.nullvalue`命令告诉 SQLite 将`NULL`值显示为`NULL`。 默认情况下,SQLite 显示`NULL`值的空字符串。 ```sql sqlite> INSERT INTO Cars(Id) VALUES(4); ``` `INSERT`语句省略了最后两列。 这些列将填充默认值,如果没有默认值,则填充`NULL`。 `Name`列没有默认值,因此有一个`NULL`值。 在`CREATE TABLE`语句中,我们已指定`Price`列具有`"Not available"`默认值。 ```sql sqlite> SELECT * FROM Cars WHERE Id=4; Id|Name|Price 4|NULL|Not available ``` 在第二列中,我们有一个`NULL`值。 第三个具有默认的`"Not available"`字符串。 ```sql sqlite> INSERT INTO Cars VALUES(4, 'Volvo', 29000); Error: UNIQUE constraint failed: Cars.Id ``` 假设我们想将所有信息放入第四列。 尝试将新数据插入现有行会产生以下错误:`UNIQUE`约束失败:`Cars.Id`。 ```sql sqlite> INSERT OR REPLACE INTO Cars VALUES(4, 'Volvo', 29000); ``` 在这种情况下,我们可以使用`INSERT OR REPLACE`语句。 使用`UPDATE`语句可以完成相同的操作。 ```sql sqlite> SELECT * FROM Cars WHERE Id=4; Id|Name|Price 4|Volvo|29000 ``` 现在,所有信息都在第四行。 ```sql sqlite> INSERT OR FAIL INTO Cars VALUES(4, 'Bentley', 350000); Error: UNIQUE constraint failed: Cars.Id ``` `INSET OR FAIL INTO`语句等于`INSERT INTO`语句。 它只是更具体一点,即在发生错误时失败。 ```sql 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`语句插入多行。 ```sql sqlite> CREATE TEMP TABLE Ints(Id INTEGER PRIMARY KEY, Val INTEGER); ``` 我们将使用单列`Ints`表来显示多行`INSERT`语句。 该表的孤行列存储整数。 ```sql sqlite> INSERT INTO Ints(Val) VALUES (1), (3), (5), (6), (7), (8), (6), (4), (9); ``` 我们一口气将九行插入表中。 这些行紧跟`VALUES`关键字,并以逗号分隔。 ```sql 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`语句。 ```sql sqlite> CREATE TABLE Cars2(Id INTEGER PRIMARY KEY, Name TEXT, Price INTEGER); ``` 首先,我们创建一个名为`Cars2`的新表。 ```sql sqlite> INSERT INTO Cars2 SELECT * FROM Cars; ``` 在这里,我们将`Cars`表中的所有数据插入`Cars2`表中。 ```sql sqlite> SELECT * FROM Cars2; Id|Name|Price 1|Audi|52642 2|Mercedes|57127 3|Skoda|9000 4|Volvo|29000 ``` 我们验证。 ## SQLite 删除数据 `DELETE`关键字用于从表中删除数据。 首先,我们将从表中删除一行。 我们将使用之前创建的`Cars2`表。 ```sql sqlite> DELETE FROM Cars2 WHERE Id=1; ``` 我们用`Id` 1 删除一行。 ```sql sqlite> SELECT * FROM Cars2; Id|Name|Price 2|Mercedes|57127 3|Skoda|9000 4|Volvo|29000 ``` 我们验证第一行是否丢失。 ```sql sqlite> DELETE FROM Cars2; ``` 该 SQL 语句删除表中的所有数据。 ```sql sqlite> SELECT Count(Id) AS '# of cars' FROM Cars2; # of cars --------------- 0 ``` 此 SQL 语句确认`Cars2`表中现在没有行。 ```sql 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'`。 以下语句显示了如何完成此操作: ```sql sqlite> .read cars.sql sqlite> UPDATE Cars SET Name='Skoda Octavia' WHERE Id=3; ``` SQL 语句将`Id=3`列的汽车名称设置为'Skoda Octavia'。 ```sql sqlite> SELECT * FROM Cars WHERE Id=3; 3|Skoda Octavia|9000 ``` 该行已正确更新。 在 SQLite 教程的这一部分中,我们已经在数据库表中插入,删除和更新了数据。