簡體   English   中英

將數據插入一個表中,從另一個表中刪除,並在MySQL中使用時間戳記條件

[英]Insert data in one table, remove from another, with timestamp condition in mysql

簡而言之

有沒有一種安全的方法可以根據時間戳條件將數據庫條目移動到另一個表(無需先查詢時間)? 為了確保這一點, INSERT INTODELETE嗎?

問題的背景

  • 這個問題與使用事務的重要性無關,這是必然的! 而是關於以下問題:兩個后續查詢的時間 (例如NOW()的值) 可能不同
  • 由於使用的編程框架(出於安全原因)不允許在單個調用中執行多個查詢,因此這確實成為一個問題

表結構示例

Source
---------------------------------------------
ID        |  Timeout              |  Data
---------------------------------------------
1         |  2014-12-31 12:00:00  |  foo
2         |  2014-12-31 15:00:00  |  bar
3         |  2014-12-31 18:00:00  |  foobar

Archive
---------------------------------------------
ID        |  Data
---------------------------------------------

示范(簡體)

<?php

    beginTransaction();
    try {
        // Imagine this happens at 2014-12-31 14:59:59(.992) [Entry #2 not copied]
        execute( "INSERT INTO Archive (ID, Data) 
                      SELECT ID, Data FROM Source
                      WHERE Timeout <= NOW()" );

        // While here it might be already 2014-12-31 15:00:00(.004) [Entry #2 deleted]
        execute("DELTE FROM Source WHERE Timeout <= NOW()");
        commit();
    }
    catch (Exception $e) {
        rollBack();
        return false;
    }

    return;
?>

因此,有一種安全的方法可以避免此問題,最好是考慮到性能 (我知道,在這種情況下,php首先可能是錯誤的語言^^)。 幫助非常感謝!

execute("SET @now = NOW()");

execute("
    INSERT INTO Archive (ID, Data) 
    SELECT ID, Data 
    FROM Source
    WHERE Timeout <= @now
");

execute("DELTE FROM Source WHERE Timeout <= @now");

要么

execute("
    INSERT INTO Archive (ID, Data) 
    SELECT ID, Data 
    FROM Source
    WHERE Timeout <= NOW()
");

execute("DELTE FROM Source WHERE Timeout <= (SELECT MAX(Timeout) FROM Archive)");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM