SQLite 错误处理

SQLiteSQLiteBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sqlite(("SQLite")) -.-> sqlite/SQLiteGroup(["SQLite"]) sqlite/SQLiteGroup -.-> sqlite/init_db("Create SQLite Database") sqlite/SQLiteGroup -.-> sqlite/make_table("Create New Table") sqlite/SQLiteGroup -.-> sqlite/add_row("Insert Single Row") sqlite/SQLiteGroup -.-> sqlite/add_rows("Insert Multiple Rows") sqlite/SQLiteGroup -.-> sqlite/start_trans("Begin New Transaction") sqlite/SQLiteGroup -.-> sqlite/undo_trans("Rollback Transaction") subgraph Lab Skills sqlite/init_db -.-> lab-552550{{"SQLite 错误处理"}} sqlite/make_table -.-> lab-552550{{"SQLite 错误处理"}} sqlite/add_row -.-> lab-552550{{"SQLite 错误处理"}} sqlite/add_rows -.-> lab-552550{{"SQLite 错误处理"}} sqlite/start_trans -.-> lab-552550{{"SQLite 错误处理"}} sqlite/undo_trans -.-> lab-552550{{"SQLite 错误处理"}} end

创建具有 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', '[email protected]');

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

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

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

SELECT * FROM users;

预期输出:

1|Alice|[email protected]

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

尝试插入重复数据

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

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

INSERT INTO users (username, email) VALUES ('Alice', '[email protected]');

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

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', '[email protected]');

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

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

SELECT * FROM users;

预期输出:

1|Alice|[email protected]

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

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

使用 ON CONFLICT REPLACE 处理约束冲突

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

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

INSERT OR REPLACE INTO users (id, username, email) VALUES (1, 'Alice', '[email protected]');

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

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

SELECT * FROM users;

预期输出:

1|Alice|[email protected]

输出显示,用户名是 'Alice' 的记录的电子邮件地址已更新为 [email protected]

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

最后,退出 SQLite shell:

.exit

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

总结

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