SQL 中的 TCL 命令2025 年 2 月 2 日 | 8 分钟阅读
现在让我们通过示例更深入地了解 SQL 的 TCL 命令。示例中的所有查询都将使用 MySQL 数据库编写。 1. COMMITSQL 中的 COMMIT 命令用于将所有与事务相关的更改永久保存到磁盘。每当使用 DDL 命令(如 INSERT、UPDATE 和 DELETE)时,这些命令所做的更改只有在关闭当前会话后才永久生效。因此,在关闭会话之前,可以轻松回滚 DDL 命令所做的更改。因此,如果要在不关闭会话的情况下将更改永久保存到磁盘,我们将使用 commit 命令。 语法 示例 我们将选择一个现有数据库,即 school。 ![]() 要创建一个名为 t_school 的表,我们将执行以下查询 ![]() BEGIN / START TRANSACTION 命令用于启动事务。 ![]() 现在,我们将执行以下查询,同时在 t_school 表中插入多条记录。 ![]() 现在我们将执行 SELECT 查询,以验证上面执行的 INSERT INTO 查询的执行情况。 在 t_school 表上执行 SELECT 查询后,您将获得以下输出
SELECT 查询的输出显示所有记录都已成功插入。 我们将执行 COMMIT 命令来保存对 t_school 表执行的操作结果。 ![]() MySQL 默认启用自动提交。要将其关闭,我们将把自动提交的值设置为 0。 ![]() MySQL 默认会提交用户执行的每个查询。但如果用户希望只提交特定查询而不是提交每个查询,那么关闭自动提交会很有用。 2. SAVEPOINT我们可以将数据库操作划分为多个部分。例如,我们可以将所有连续执行的插入相关查询视为事务的一部分,而删除命令视为事务的另一部分。使用 SQL 中的 SAVEPOINT 命令,我们可以使用不同的名称保存同一事务的这些不同部分。例如,我们可以使用名为 INS 的保存点保存所有插入相关查询。要将所有插入相关查询保存到一个保存点中,我们必须在完成插入命令执行后执行 SAVEPOINT 查询,后跟保存点名称。 语法 3. ROLLBACK在执行事务时,我们必须创建保存点以保存事务的不同部分。根据用户不断变化的需求,他/她可以将事务回滚到不同的保存点。考虑一种情况:我们已经启动了一个事务,然后创建了表并将记录插入到表中。插入记录后,我们创建了一个名为 INS 的保存点。然后我们执行了一个删除查询,但后来我们认为我们不小心删除了有用的记录。因此,在这种情况下,我们有一个回滚事务的选项。在这种情况下,我们必须使用 ROLLBACK 命令将事务回滚到我们在执行 DELETE 查询之前创建的保存点 INS。 语法 理解 SAVEPOINT 和 ROLLBACK 命令的示例 示例 1 我们将选择一个现有数据库,即 school。 ![]() 要创建一个名为 t_school 的表,我们将执行以下查询 ![]() 现在,我们将执行以下查询,同时在 t_school 表中插入多条记录。 ![]() 现在我们将执行 SELECT 查询,以验证上面执行的 INSERT INTO 查询的执行情况。 在 t_school 表上执行 SELECT 查询后,您将获得以下输出
|
SELECT 查询的输出显示所有记录都已成功插入。
BEGIN / START TRANSACTION 命令用于启动事务。
如我们所知,SQL 中的 SAVEPOINT 命令用于使用不同的名称保存同一事务的不同部分。将此点视为我们事务的一部分。我们将使用名为 Insertion 的保存点保存此部分。
现在,我们将在 t_school 表上执行 update 命令,将 ID 为 5 的记录的 Number_Of_Students 设置为 9050。
要验证 ID 为 5 的记录的 Number_Of_Students 现在是否为 9050,我们将执行 SELECT 查询。
在 t_school 表上执行 SELECT 查询后,您将获得以下输出
ID | 学校名称 | 学生人数 | 教师人数 | 教室数量 | 电子邮件 ID |
---|---|---|---|---|---|
1 | Boys Town 公立学校 | 1000 | 80 | 12 | btps15@gmail.com |
2 | Guru Govind Singh 公立学校 | 800 | 35 | 15 | ggps25@gmail.com |
3 | 德里公立学校 | 1200 | 30 | 10 | dps101@gmail.com |
4 | Ashoka 国际学校 | 1110 | 40 | 40 | aus17@gmail.com |
5 | Calibers 英语中学 | 9000 | 31 | 50 | cems@gmail.com |
SELECT 查询的输出显示 ID 为 5 的记录已成功更新。
将更新操作视为我们事务的一部分。我们将使用名为 Updation 的保存点保存此部分。
突然,我们的需求改变了,我们意识到我们更新了一条不应该更新的记录。在这种情况下,我们需要将事务回滚到在执行 UPDATE 命令之前创建的保存点。
我们不需要对记录执行更新。因此,我们已回滚到名为 Insertion 的保存点。
为了确认我们已获得与执行更新操作之前相同的 t_school 表,我们将再次执行 SELECT 查询。
ID | 学校名称 | 学生人数 | 教师人数 | 教室数量 | 电子邮件 ID |
---|---|---|---|---|---|
1 | Boys Town 公立学校 | 1000 | 80 | 12 | btps15@gmail.com |
2 | Guru Govind Singh 公立学校 | 800 | 35 | 15 | ggps25@gmail.com |
3 | 德里公立学校 | 1200 | 30 | 10 | dps101@gmail.com |
4 | Ashoka 国际学校 | 1110 | 40 | 40 | aus17@gmail.com |
5 | Calibers 英语中学 | 9000 | 31 | 50 | cems@gmail.com |
SELECT 查询输出确认事务现在已成功回滚到保存点“Insertion”。
示例 2
我们将选择一个现有数据库,即 bank。
要创建一个名为 customer 的表,我们将执行以下查询
现在,我们将执行以下查询,同时在 customer 表中插入多条记录。
现在我们将执行 SELECT 查询,以验证上面执行的 INSERT INTO 查询的执行情况。
在 t_school 表上执行 SELECT 查询后,您将获得以下输出
客户 ID | 名称 | 年龄 | 薪金 | 薪资_银行账户 |
---|---|---|---|---|
1 | Aryan Jain | 51 | 56000 | SBI |
2 | Arohi Dixit | 21 | 25000 | Axis |
3 | Vineet Garg | 24 | 31000 | ICICI |
4 | Anuja Sharma | 26 | 49000 | HDFC |
5 | Deepak Kohli | 28 | 65000 | SBI |
SELECT 查询的输出显示所有记录都已成功插入。
BEGIN / START TRANSACTION 命令用于启动事务。
如我们所知,SQL 中的 SAVEPOINT 命令用于使用不同的名称保存同一事务的不同部分。将此点视为我们事务的一部分。我们将使用名为 Insertion 的保存点保存此部分。
我们将在 customer 表上执行 delete 命令,以删除 ID 为 5 的记录。
我们将执行 SELECT 查询以验证 ID 为 5 的记录是否已删除。
客户 ID | 名称 | 年龄 | 薪金 | 薪资_银行账户 |
---|---|---|---|---|
1 | Aryan Jain | 51 | 56000 | SBI |
2 | Arohi Dixit | 21 | 25000 | Axis |
3 | Vineet Garg | 24 | 31000 | ICICI |
4 | Anuja Sharma | 26 | 49000 | HDFC |
SELECT 查询的输出显示 ID 为 5 的记录已成功删除。
将删除操作视为我们事务的一部分。我们将使用名为 Deletion 的保存点保存此部分。
突然,我们的需求改变了,我们意识到我们删除了一条不应该删除的记录。在这种情况下,我们需要将事务回滚到在执行 DELETE 命令之前创建的保存点。
我们不需要对记录执行删除。因此,我们已回滚到名为 Insertion 的保存点。
为了确认我们已获得与执行删除操作之前相同的客户表,我们将再次执行 SELECT 查询。
客户 ID | 名称 | 年龄 | 薪金 | 薪资_银行账户 |
---|---|---|---|---|
1 | Aryan Jain | 51 | 56000 | SBI |
2 | Arohi Dixit | 21 | 25000 | Axis |
3 | Vineet Garg | 24 | 31000 | ICICI |
4 | Anuja Sharma | 26 | 49000 | HDFC |
5 | Deepak Kohli | 28 | 65000 | SBI |
SELECT 查询输出确认事务现在已成功回滚到保存点“Insertion”。
我们请求您订阅我们的新闻通讯以获取最新更新。