首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原子复制一个MySQL表覆盖另一个表?

原子复制一个MySQL表覆盖另一个表?
EN

Stack Overflow用户
提问于 2009-06-01 17:06:58
回答 4查看 1.9K关注 0票数 8

我正在尝试“原子地”复制一个表到另一个表。基本上,我希望定期更新表,这样,如果另一个进程正在更新表,则从表中读取的进程将不会得到不完整的结果。

为了给出一些背景信息,我想要一个表,作为一个游戏的排行榜。这个排行榜将通过一个单独的过程每隔几分钟更新一次。我的想法是:

表分数包含当用户查看排行榜时将从中读取的可公开查看的排行榜。此表每隔几分钟更新一次。更新排行榜的过程将创建一个包含新排行榜的SCORES_TEMP表。一旦创建了该表,我希望将它的所有内容“原子地”复制到SCORES中。我想我想要做的是:

代码语言:javascript
复制
TRUNCATE TABLE SCORES;
INSERT INTO SCORES SELECT * FROM SCORES_TEMP;

我想把所有的分数都换掉。我不需要维护我的主键或自动增量值。我只想把所有来自SCORES_TEMP的数据带进来。但我知道,如果有人在这两个语句完成之前查看分数,排行榜将是空白的。我如何才能做到这一点,使它永远不会显示空白或不完整的数据?谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-06-01 17:14:43

使用rename table

代码语言:javascript
复制
RENAME TABLE old_table TO backup_table, new_table TO old_table;

它是原子的,可以在所有的存储引擎上工作,并且不需要重新构建索引。

票数 12
EN

Stack Overflow用户

发布于 2009-06-01 17:12:20

在MySQL中,由于the behavior of TRUNCATE的原因,我认为您需要:

代码语言:javascript
复制
BEGIN TRANSACTION;
DELETE FROM SCORES;
INSERT INTO SCORES SELECT * FROM SCORES_TEMP;
COMMIT TRANSACTION;

我不确定是否有一种方法可以确保DDL操作事务的安全性。

票数 2
EN

Stack Overflow用户

发布于 2009-06-01 17:13:03

您可以使用事务(用于InnoDB),

代码语言:javascript
复制
BEGIN TRANSACTION;
DELETE FROM SCORES;
INSERT INTO SCORES SELECT * FROM SCORES_TEMP;
COMMIT;

LOCK TABLES (用于MyISAM):

代码语言:javascript
复制
LOCK TABLES;
DELETE FROM SCORES;
INSERT INTO SCORES SELECT * FROM SCORES_TEMP;
UNLOCK TABLES;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/935760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档