我在mysql中有一个表,如下所示 -
++++++++++++
+ my_table +
++++++++++++
id
is_done
++++++++++++
我有一个PHP脚本,它执行如下操作 -
<?php
$q=mysql_query("SELECT * FROM my_table WHERE is_done=0");
while($res=mysql_fetch_assoc($q)){
$id=$res['id'];
//do something lengthy
sleep(60);
mysql_query("UPDATE my_table SET is_done=1 WHERE id='$id'");
}
?>
现在,如果我手动更改mysql中的一行并为该行设置is_done=1
,脚本仍会处理该行。如何调整我的脚本以从mysql读取新的和更新的行并跳过已标记为已完成的行?
答案 0 :(得分:0)
为什么不把简单的事情搞定。使用睡眠的目的是什么?
mysql_query("UPDATE my_table SET is_done=1 WHERE is_done=0");
您没有在整个表格中查询并逐个更改。
如果您需要使用睡眠,请尝试以下方法:
mysql_query("UPDATE my_table SET is_done=1 WHERE is_done=0 and id='$id'");
答案 1 :(得分:0)
如果你担心调用不必要的sql语句,我建议将id聚合到一个数组并在循环外更新(性能):
<?php
$q=mysql_query("SELECT * FROM my_table WHERE is_done=0");
$ids = array();
while($res=mysql_fetch_assoc($q)){
$ids[]=$res['id'];
//do something lengthy
sleep(60);
}
mysql_query("UPDATE my_table SET is_done=1 WHERE id IN ('".implode("','", $ids)."')");
?>
对于已包含新数据的行,MySQL不会执行任何操作(没有受影响的行,其中is_done = 1)。
如果您正在执行的操作令人担心,您可以使用Transaction来确保您正在执行的操作是Atomic,或Table Locking以确保不会发生任何更改脚本正在运行。