在 MySQL 上的安全事务中截断和插入

Cla*_*key 7 mysql transaction truncate rollback

我想TRUNCATEINSERT数据到MySQL的InnoDB表。

我想确保如果事务中的任何语句失败,数据都不会受到影响。

如果出现故障,我不能有一个空的或损坏的表。

这就是我打算这样做的方式。

  1. BEGIN TRANSACTION
  2. TRUNCATE TABLE table_name
  3. INSERT INTO table_name
  4. COMMIT

然后我了解到这TRUNCATE TABLE table_name 会导致隐式 COMMIT,这使得整个交易毫无意义。

然后我TRUNCATE TABLE table_name用一种DELETE FROM table_name方法替换了,这并不理想 - 但这也会导致隐式 COMMIT

DROP TABLE table_name并且CREATE TABLE table_name还会导致隐式 COMMIT!

什么方法/逻辑最适合执行我想要做的事情?

使用运行在 Windows Server 2008 R2 上的 MySQL 5.6.17 64 位服务器

Rol*_*DBA 5

由于 TRUNCATE TABLE 执行隐式提交,因此不要使用它

只要表没有外键,你可以像这样快速完成:

CREATE TABLE mytable_new LIKE mytable; 
RENAME TABLE mytable TO mytable_old,mytable_new TO mytable;
INSERT INTO mytable ... ;
Run Code Online (Sandbox Code Playgroud)

如果 INSERT 成功,则运行此

DROP TABLE mytable_old;
Run Code Online (Sandbox Code Playgroud)

如果 INSERT 回滚,只需恢复

RENAME TABLE mytable TO mytable_zap,mytable_old TO mytable;
DROP TABLE mytable_zap;
Run Code Online (Sandbox Code Playgroud)

试一试 !!!