Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在mysql中使用时间戳条件在一个表中插入数据,从另一个表中删除数据 简言之_Php_Mysql_Performance_Time_Pdo - Fatal编程技术网

Php 在mysql中使用时间戳条件在一个表中插入数据,从另一个表中删除数据 简言之

Php 在mysql中使用时间戳条件在一个表中插入数据,从另一个表中删除数据 简言之,php,mysql,performance,time,pdo,Php,Mysql,Performance,Time,Pdo,是否有一种安全的方法可以根据时间戳条件将数据库条目移动到另一个表中(无需首先查询时间)?为了确保,INSERT-INTO与DELETE在相同的条目上工作 问题的背景 这个问题不是关于使用事务的重要性,这是一个给定的问题!但是问题在于时间(例如NOW())的值对于随后的两个查询可能不同 由于使用了一个编程框架(出于安全原因),不允许在一个调用中执行多个查询,因此这确实成为一个问题 示例表结构 演示(简化) 因此,有没有一种安全的方法来避免这个问题,最好是考虑到性能(我知道,在这种情况下,p

是否有一种安全的方法可以根据时间戳条件将数据库条目移动到另一个表中(无需首先查询时间)?为了确保,
INSERT-INTO
DELETE
在相同的条目上工作

问题的背景
  • 这个问题不是关于使用事务的重要性,这是一个给定的问题!但是问题在于时间(例如
    NOW()
    的值对于随后的两个查询可能不同
  • 由于使用了一个编程框架(出于安全原因),不允许在一个调用中执行多个查询,因此这确实成为一个问题
示例表结构 演示(简化)

因此,有没有一种安全的方法来避免这个问题,最好是考虑到性能(我知道,在这种情况下,php可能首先是错误的语言^^^)。非常感谢您的帮助

execute(“SET@now=now()”);
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");
执行(” 插入存档(ID、数据) 选择ID、数据 来源 其中,Timeout只是一个简短(可能很明显)的注释:如果您还将其他数据存储在
存档
中,而不仅仅是从一个
表中存储,则第二种方法不起作用(如预期的那样)。(在我的例子中,我实际上将登录数据存储在那里,在存档中,我将尝试和成功登录结合在一起;它们以前存储在两个不同的表中。)然而,作为单个表的存档,这是一个很好的解决方案!
<?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;
?>
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)");