【问题标题】:Atomic [move to another table, then delete original data]atomic [移动到另一个表,然后删除原始数据]
【发布时间】:2010-05-20 15:56:02
【问题描述】:

我有一个Data表和一个Archive表。

一个 webapp 将数据倒入 Data 表中,一个 cron 作业每小时提取一次数据并将其归档到 Archive 表中(这样可以保持 数据表 小且易于使用)。

在我看来,有两个伪 SQL 查询要运行:

INSERT Archive SELECT * FROM Data;

&

DELETE FROM Data;

但是,我只想删除成功复制的数据,如果复制失败,我希望它保持一致状态,既不移动一半也不删除数据。

这样做的正确方法是什么?

【问题讨论】:

    标签: mysql atomic


    【解决方案1】:

    通过交易。

    start transaction;
    insert into archive select * from data;
    delete from data where primary_key in (select primary_key from archive);
    commit;
    

    【讨论】:

    • 一些数据库系统在事务期间的查询并不一致,仅在更新时,因此“从数据中删除”可能会或可能不会删除插入后添加的内容,这就是我建议使用的原因删除中的一个查询。
    • 我想你打算从子查询中的存档表中选择:delete from data where primary_key in (select primary_key from archive);
    • 另外,begin transaction 不是有效的 MySQL 命令。正确的命令是start transaction
    【解决方案2】:

    我建议使用多表删除语法,并加入存档表以进行删除。这样您只会删除两个表中的行。

    简单示例:

    insert into archive select * from data;
    delete data.*
    from data
    inner join archive on archive.id = data.id;
    

    除此之外,您可能需要考虑将其分解为更小的块以获得更好的性能。 例如:

    insert into archive select * from data where id > 1000 and id <= 2000;
    delete data.*
    from data
    inner join archive on archive.id = data.id
    where data.id > 1000 and data.id <= 2000;
    

    从手册: http://dev.mysql.com/doc/refman/5.1/en/delete.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多