# 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 教程的这一部分中，我们已经在数据库表中插入，删除和更新了数据。