SQLite 错误处理

SQLiteBeginner
立即练习

介绍

在这个实验中,你将学习如何在 SQLite 数据库中有效地处理错误。主要重点是使用 ON CONFLICT 子句管理 INSERT 操作期间的约束冲突(constraint violations)。

你将首先创建一个数据库和一个具有 UNIQUE 约束的表。然后,你将探索发生冲突时可以采取的不同操作,例如 ROLLBACKABORTFAILIGNOREREPLACE,特别是使用 ON CONFLICT IGNORE 来防止违反唯一约束时插入数据。本实验将通过实际示例指导你完成插入数据和处理潜在错误的过程。

创建一个带有 UNIQUE 约束的 SQLite 数据库和表

在此步骤中,你将创建一个 SQLite 数据库和一个具有 UNIQUE 约束的表。此约束将帮助你了解如何在插入重复数据时处理错误。

首先,在 LabEx VM 中打开你的终端。你的默认路径是 /home/labex/project

现在,让我们创建一个名为 my_database.db 的 SQLite 数据库。运行以下命令以创建数据库文件并打开 SQLite 命令行工具:

sqlite3 my_database.db

你将看到一个提示,表明你现在位于 SQLite shell 中:

SQLite version 3.x.x
Enter ".help" for usage hints.
sqlite>

接下来,创建一个名为 users 的表来存储用户信息。此表将包含三列:idusernameemailusername 列将具有 UNIQUE 约束,这意味着每个用户名在表中必须是唯一的。在 sqlite> 提示符下输入以下 SQL 命令,然后按 Enter 键:

CREATE TABLE users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT UNIQUE NOT NULL,
    email TEXT NOT NULL
);

此命令设置 users 表,其中:

  • id 是一个整数,对于每个新条目都会自动递增。 PRIMARY KEY 约束确保每个 id 都是唯一的,并且 AUTOINCREMENT 使其自动递增。
  • username 是一个文本字段,不能为空 (NOT NULL) 并且必须是唯一的 (UNIQUE)。
  • email 也是一个文本字段,不能为空 (NOT NULL)。

如果命令成功运行,你将看不到任何输出。

向表中插入数据

现在你已经创建了 users 表,让我们向其中添加一些数据。我们将向表中插入一个用户记录。

通过在 sqlite> 提示符下运行此命令,将用户记录插入到 users 表中:

INSERT INTO users (username, email) VALUES ('Alice', 'alice@example.com');

此命令将一行添加到 users 表。

  • INSERT INTO users (username, email) 指定你正在将数据插入到 users 表的 usernameemail 列中。
  • VALUES ('Alice', 'alice@example.com') 提供了要为每个记录插入的值。

要确认数据已正确添加,请运行以下命令以查看表中的所有记录:

SELECT * FROM users;

预期输出:

1|Alice|alice@example.com

此输出显示记录的 idusernameemailSELECT * 命令检索指定表中的所有列。

尝试插入重复数据

在此步骤中,你将尝试插入一条具有重复用户名的记录。这将违反 UNIQUE 约束并导致错误。

sqlite> 提示符下运行以下命令:

INSERT INTO users (username, email) VALUES ('Alice', 'alice2@example.com');

你将看到类似于以下的错误消息:

Error: UNIQUE constraint failed: users.username

此错误消息表明 username 列上的 UNIQUE 约束已被违反。SQLite 会阻止插入重复的用户名,以维护数据完整性。

使用 ON CONFLICT IGNORE 处理约束冲突

在此步骤中,你将学习如何使用 ON CONFLICT IGNORE 子句来处理约束冲突。此子句告诉 SQLite,如果插入操作会违反约束,则忽略该插入操作。

sqlite> 提示符下运行以下命令:

INSERT OR IGNORE INTO users (username, email) VALUES ('Alice', 'alice2@example.com');

此命令尝试插入一条用户名是 'Alice' 的新记录。但是,由于使用了 ON CONFLICT IGNORE 子句,SQLite 将忽略该插入操作,并且不会引发任何错误。

要确认未插入重复记录,请运行以下命令:

SELECT * FROM users;

预期输出:

1|Alice|alice@example.com

输出显示表中仅存在用户名是 'Alice' 的原始记录。重复的记录被忽略了。

INSERT OR IGNORE 语句提供了一种在插入可能违反约束的数据时,防止错误并维护数据完整性的方法。

使用 ON CONFLICT REPLACE 处理约束冲突

在此步骤中,你将学习如何使用 ON CONFLICT REPLACE 子句来处理约束冲突。此子句告诉 SQLite,如果插入操作会违反约束,则用新记录替换现有记录。

sqlite> 提示符下运行以下命令:

INSERT OR REPLACE INTO users (id, username, email) VALUES (1, 'Alice', 'alice3@example.com');

此命令尝试插入一条用户名是 'Alice' 的新记录。由于使用了 ON CONFLICT REPLACE 子句,SQLite 将用新记录替换现有记录。请注意,在这种情况下我们需要指定 id,因为 REPLACE 将删除旧行并插入新行。

要确认记录已被替换,请运行以下命令:

SELECT * FROM users;

预期输出:

1|Alice|alice3@example.com

输出显示,用户名是 'Alice' 的记录的电子邮件地址已更新为 alice3@example.com

INSERT OR REPLACE 语句提供了一种在维护数据完整性的同时更新现有记录的方法。

最后,退出 SQLite shell:

.exit

这将关闭数据库连接并返回到终端。

总结

在这个实验中,你已经学习了如何在 SQLite 数据库中有效地处理错误,重点关注 INSERT 操作期间的约束冲突。你创建了一个数据库和一个带有 UNIQUE 约束的表,插入了数据,然后尝试插入重复数据以触发错误。接着,你探索了如何使用 ON CONFLICT IGNOREON CONFLICT REPLACE 子句来处理这些约束冲突,从而控制 SQLite 如何响应潜在的错误并维护数据完整性。