未提交的insert可用rollback立即撤回,前提是显式开启事务且未commit;已提交的需手动编写逆向delete或依赖binlog解析恢复,不存在一键撤销。

没提交的 INSERT,直接 ROLLBACK 就能撤回;已提交的,只能靠手动逆向 SQL 或 binlog 恢复——没有“一键撤销”这种事。
未提交事务下,用 ROLLBACK 立即撤回
这是最干净、最可靠的方式,前提是 INSERT 还在同一个未提交的事务里。
- 必须显式开启事务:
BEGIN TRANSACTION(SQL Server)或START TRANSACTION(MySQL),不能依赖隐式事务 - 执行 INSERT 后别急着
COMMIT,先验证数据是否正确 - 发现问题?直接运行
ROLLBACK,所有 INSERT 行立刻消失,表状态回到事务开始前 - 注意:一旦执行了
COMMIT或隐式提交(比如 DDL 语句、SET AUTOCOMMIT = 1),ROLLBACK就失效了
已提交的 INSERT,只能生成逆向 DELETE
INSERT 已落库且提交,数据库不会自动记住“谁插的、什么时候插的”,得靠你提供足够信息来定位并删掉它。
- 如果 INSERT 显式指定了主键(如
INSERT INTO users (id, name) VALUES (1001, 'Alice')),直接写DELETE FROM users WHERE id = 1001 - 如果用的是自增主键且没记 ID,就得靠其他字段组合筛选,例如:
DELETE FROM orders WHERE user_id = 123 AND amount = 99.9 AND created_at > '2026-07-21 09:00:00' - 慎用模糊条件:
WHERE status = 'pending'可能误删其他正常数据 - 强烈建议先用
SELECT预查:SELECT * FROM table WHERE ...确认要删的行完全匹配,再执行 DELETE
SQL Server 中用 SET XACT_ABORT ON 防止部分提交
默认情况下,事务里某条 INSERT 报错(比如主键冲突),后续语句仍可能继续执行,导致“只回滚最后一句”,前面成功的 INSERT 白插了。
- 加
SET XACT_ABORT ON后,只要任意语句出错,整个事务自动终止并回滚 - 它不改变
ROLLBACK的行为,但让事务更符合“全有或全无”的直觉 - 注意:该设置只对当前会话有效,且对某些错误(如编译期错误)无效
- 搭配
TRY...CATCH更稳妥,尤其在存储过程中
MySQL 存储过程里必须手动捕获错误再回滚
MySQL 默认不会因单条 INSERT 失败就中断后续语句,也不会自动回滚——它把控制权完全交给你。
- 必须声明错误处理器:
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION - 在 handler 里设标志位或直接调用
ROLLBACK,不能只靠IF @@ERROR(MySQL 没这个全局变量) -
CONTINUE和EXIT行为差异大:CONTINUE执行完 handler 还继续往下走,EXIT则跳出当前 BEGIN...END 块 - 别忘了显式
START TRANSACTION,MyISAM 表不支持事务,用了也白搭
真正麻烦的从来不是怎么写 ROLLBACK,而是你怎么确认那几行 INSERT 是错的、谁插的、什么时候插的、有没有被其他业务逻辑连带修改——这些信息不在事务日志里,得靠你提前留痕。











