SQL savapoint
- savapoint是与回滚命令一起使用的SQL命令。
- 它是事务控制语言中的一个命令,用于在表中标记事务。
- 假设您正在创建一个非常长的表,并且您希望仅回滚到表中的某个特定位置,那么可以使用保存点来实现这一点。
- 如果您在表中进行了事务处理,您可以将该事务标记为某个名称,稍后,如果您想回滚到该点,可以通过使用事务的名称轻松地完成。
- 在仅希望回滚表的一小部分而不是整个表时,保存点非常有用。简单来说,我们可以说保存点是SQL中的一个书签。
让我们看一些实际的例子来更清楚地理解这个概念。我们将使用MySQL数据库来编写所有查询。
要在数据库中创建一个表,首先,我们需要选择要在其中创建表的数据库。
mysql> USE dbs;
然后我们将编写一个查询,在选定的数据库’dbs’中创建一个名为student的表。
mysql> CREATE TABLE student(ID INT, Name VARCHAR(20), Percentage INT, Location VARCHAR(20), DateOfBirth DATE);
现在,我们将编写一个查询来在student表中插入多条记录:
mysql> INSERT INTO student(ID, Name, Percentage, Location, DateOfBirth) VALUES(1, "Manthan Koli", 79, "Delhi", "2003-08-20"), (2, "Dev Dixit", 75, "Pune", "1999-06-17"), (3, "Aakash Deshmukh", 87, "Mumbai", "1997-09-12"), (4, "Aaryan Jaiswal", 90, "Chennai", "2005-10-02"), (5, "Rahul Khanna", 92, "Ambala", "1996-03-04"), (6, "Pankaj Deshmukh", 67, "Kanpur", "2000-02-02"), (7, "Gaurav Kumar", 84, "Chandigarh", "1998-07-06"), (8, "Sanket Jain", 61, "Shimla", "1990-09-08"), (9, "Sahil Wagh", 90, "Kolkata", "1968-04-03");
为了验证学生表中插入了多条记录,我们将执行SELECT查询。
mysql> SELECT *FROM student;
ID | Name | Percentage | Location | DateOfBirth |
---|---|---|---|---|
1 | Manthan Koli | 79 | Delhi | 2003-08-20 |
2 | Dev Dixit | 75 | Pune | 1999-06-17 |
3 | Aakash Deshmukh | 87 | Mumbai | 1997-09-12 |
4 | Aaryan Jaiswal | 90 | Chennai | 2005-10-02 |
5 | Rahul Khanna | 92 | Ambala | 1996-03-04 |
6 | Pankaj Deshmukh | 67 | Kanpur | 2000-02-02 |
7 | Gaurav Kumar | 84 | Chandigarh | 1998-07-06 |
8 | Sanket Jain | 61 | Shimla | 1990-09-08 |
9 | Sahil Wagh | 90 | Kolkata | 1968-04-03 |
结果显示,十条记录均成功插入。
要在SQL中使用TCL命令,首先需要使用BEGIN / START TRANSACTION命令启动事务。
mysql> START TRANSACTION;
我们将使用SAVEPOINT命令保存我们初始化的事务,以及该保存点的一些特定名称。
mysql> SAVEPOINT ini;
这里,我们已经将初始的事务保存为名称为’ini’的文件。
然后,我们决定向现有的学生表中插入一个ID为10的新记录。
mysql> INSERT INTO student VALUES (10, "Saurabh Singh", 54, "Kashmir", "1989-01-06");
我们将执行SELECT查询来验证成功插入了ID为十的新记录。
mysql> SELECT *FROM student;
ID | Name | Percentage | Location | DateOfBirth |
---|---|---|---|---|
1 | Manthan Koli | 79 | Delhi | 2003-08-20 |
2 | Dev Dixit | 75 | Pune | 1999-06-17 |
3 | Aakash Deshmukh | 87 | Mumbai | 1997-09-12 |
4 | Aaryan Jaiswal | 90 | Chennai | 2005-10-02 |
5 | Rahul Khanna | 92 | Ambala | 1996-03-04 |
6 | Pankaj Deshmukh | 67 | Kanpur | 2000-02-02 |
7 | Gaurav Kumar | 84 | Chandigarh | 1998-07-06 |
8 | Sanket Jain | 61 | Shimla | 1990-09-08 |
9 | Sahil Wagh | 90 | Kolkata | 1968-04-03 |
10 | Saurabh Singh | 54 | Kashmir | 1989-01-06 |
为了保存与这条新插入记录相关的事务,我们将创建一个新的保存点。
mysql> SAVEPOINT ins;
在这里,新插入的记录表被保存在名为’ins’的保存点中。
要更新学生表中ID为1的记录,并将更新后的姓名设置为’Mahesh Kuwar’,我们将执行以下查询:
mysql> UPDATE student SET Name = "Mahesh Kuwar" WHERE ID =1;
为了确认记录ID为1的名称字段已成功更新,我们将再次执行SELECT查询。
mysql> SELECT *FROM student;
ID | Name | Percentage | Location | DateOfBirth |
---|---|---|---|---|
1 | Mahesh Kuwar | 79 | Delhi | 2003-08-20 |
2 | Dev Dixit | 75 | Pune | 1999-06-17 |
3 | Aakash Deshmukh | 87 | Mumbai | 1997-09-12 |
4 | Aaryan Jaiswal | 90 | Chennai | 2005-10-02 |
5 | Rahul Khanna | 92 | Ambala | 1996-03-04 |
6 | Pankaj Deshmukh | 67 | Kanpur | 2000-02-02 |
7 | Gaurav Kumar | 84 | Chandigarh | 1998-07-06 |
8 | Sanket Jain | 61 | Shimla | 1990-09-08 |
9 | Sahil Wagh | 90 | Kolkata | 1968-04-03 |
10 | Saurabh Singh | 54 | Kashmir | 1989-01-06 |
为了保存使用此更新记录的事务,我们将创建一个新的保存点。
mysql> SAVEPOINT upd;
在这里,带有更新记录的表被保存在名为’upd’的保存点上。
要从ID为6的学生表中删除记录,我们将执行以下查询:
mysql> DELETE FROM student WHERE ID= 6;
我们将再次执行SELECT查询来验证ID为6的记录是否成功被移除。
mysql> SELECT *FROM student;
ID | Name | Percentage | Location | DateOfBirth |
---|---|---|---|---|
1 | Mahesh Kuwar | 79 | Delhi | 2003-08-20 |
2 | Dev Dixit | 75 | Pune | 1999-06-17 |
3 | Aakash Deshmukh | 87 | Mumbai | 1997-09-12 |
4 | Aaryan Jaiswal | 90 | Chennai | 2005-10-02 |
5 | Rahul Khanna | 92 | Ambala | 1996-03-04 |
7 | Gaurav Kumar | 84 | Chandigarh | 1998-07-06 |
8 | Sanket Jain | 61 | Shimla | 1990-09-08 |
9 | Sahil Wagh | 90 | Kolkata | 1968-04-03 |
10 | Saurabh Singh | 54 | Kashmir | 1989-01-06 |
为了保存移除了这条记录的事务,我们将创建一个新的保存点。
mysql> SAVEPOINT del;
在这里,带有已删除记录的表以名为“del”的保存点保存。
后来,我们决定需要在前一步骤中删除的学生表中的记录。
由于在每个操作中,我们都创建了一个保存点。利用该保存点,我们可以跳转到事务的任何点。要这样做,我们将执行ROLLBACK命令,并附带我们要跳转的保存点的名称。
mysql> ROLLBACK TO upd;
由于我们不希望将ID为6的记录从student表中删除,因此我们需要回滚到名为upd的保存点。
为了验证我们在之前更新student表时所拥有的确切表格,我们将再次执行SELECT查询。
mysql> SELECT *FROM student;
ID | Name | Percentage | Location | DateOfBirth |
---|---|---|---|---|
1 | Mahesh Kuwar | 79 | Delhi | 2003-08-20 |
2 | Dev Dixit | 75 | Pune | 1999-06-17 |
3 | Aakash Deshmukh | 87 | Mumbai | 1997-09-12 |
4 | Aaryan Jaiswal | 90 | Chennai | 2005-10-02 |
5 | Rahul Khanna | 92 | Ambala | 1996-03-04 |
6 | Pankaj Deshmukh | 67 | Kanpur | 2000-02-02 |
7 | Gaurav Kumar | 84 | Chandigarh | 1998-07-06 |
8 | Sanket Jain | 61 | Shimla | 1990-09-08 |
9 | Sahil Wagh | 90 | Kolkata | 1968-04-03 |
10 | Saurabh Singh | 54 | Kashmir | 1989-01-06 |
上述结果显示我们已成功回滚到名为’upd’的保存点。