MySQL 如何在一个原子操作中重命名两个表
How to rename two tables in one atomic operation in MySQL
我需要在一个原子操作中重命名两个 table,这样用户将永远无法看到处于中间状态的数据库。
我正在使用 MySQL 并注意到 documentation:
中完美地描述了这种情况
13.3.3 Statements That Cause an Implicit Commit
The statements listed in this section (and any synonyms for them)
implicitly end any transaction active in the current session, as if
you had done a COMMIT before executing the statement
[...]
Data definition language (DDL) statements that define or modify
database objects. ALTER DATABASE ... UPGRADE DATA DIRECTORY NAME,
ALTER EVENT, ALTER PROCEDURE, ALTER SERVER, ALTER TABLE, ALTER VIEW,
CREATE DATABASE, CREATE EVENT, CREATE INDEX, CREATE PROCEDURE, CREATE
SERVER, CREATE TABLE, CREATE TRIGGER, CREATE VIEW, DROP DATABASE, DROP
EVENT, DROP INDEX, DROP PROCEDURE, DROP SERVER, DROP TABLE, DROP
TRIGGER, DROP VIEW, INSTALL PLUGIN (as of MySQL 5.7.6), RENAME TABLE,
TRUNCATE TABLE, UNINSTALL PLUGIN (as of MySQL 5.7.6).
但也许有某种解决方法或类似的方法?
我的情况是这样的:
- 我在 table 中有一个名为
current
的当前数据集
- 我在 table 中收集了一个名为
next
的新数据集
- 我需要在一个原子操作中将
current
table 重命名为 current_%current_date_time%
并将 next
table 重命名为 current
嗯,简单...
RENAME TABLE current TO current_20151221, next TO current;
如manual中所述。那里说这是一个原子操作。只是为了澄清这一点,隐式提交与它无关。那是一个不同的故事。这只是说,这些语句结束了一个开放的交易。
我需要在一个原子操作中重命名两个 table,这样用户将永远无法看到处于中间状态的数据库。
我正在使用 MySQL 并注意到 documentation:
中完美地描述了这种情况13.3.3 Statements That Cause an Implicit Commit
The statements listed in this section (and any synonyms for them) implicitly end any transaction active in the current session, as if you had done a COMMIT before executing the statement
[...]
Data definition language (DDL) statements that define or modify database objects. ALTER DATABASE ... UPGRADE DATA DIRECTORY NAME, ALTER EVENT, ALTER PROCEDURE, ALTER SERVER, ALTER TABLE, ALTER VIEW, CREATE DATABASE, CREATE EVENT, CREATE INDEX, CREATE PROCEDURE, CREATE SERVER, CREATE TABLE, CREATE TRIGGER, CREATE VIEW, DROP DATABASE, DROP EVENT, DROP INDEX, DROP PROCEDURE, DROP SERVER, DROP TABLE, DROP TRIGGER, DROP VIEW, INSTALL PLUGIN (as of MySQL 5.7.6), RENAME TABLE, TRUNCATE TABLE, UNINSTALL PLUGIN (as of MySQL 5.7.6).
但也许有某种解决方法或类似的方法?
我的情况是这样的:
- 我在 table 中有一个名为
current
的当前数据集
- 我在 table 中收集了一个名为
next
的新数据集
- 我需要在一个原子操作中将
current
table 重命名为current_%current_date_time%
并将next
table 重命名为current
嗯,简单...
RENAME TABLE current TO current_20151221, next TO current;
如manual中所述。那里说这是一个原子操作。只是为了澄清这一点,隐式提交与它无关。那是一个不同的故事。这只是说,这些语句结束了一个开放的交易。