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)");