是否可以同时进行选择和更新?
select id,name from mytable where booled = 0
UPDATE mytable SET booled=1 WHERE (select id,name from mytable where booled = 0)
可以说这两个命令合二为一。
最佳答案
无需重新发明轮子-您只需要正确使用交易即可。只要您对表使用InnoDB引擎,MySQL就支持事务(旧的MyISAM无法使用)。
以下一系列语句将满足您的要求:
BEGIN;
SELECT id,name FROM mytable WHERE booled=0;
UPDATE mytable SET booled=1 WHERE booled=0;
COMMIT;
根据您的编程语言和数据库驱动程序,您可能无法直接使用begin / commit事务语句,而是使用某些特定于框架的机制来执行此操作。例如,在Perl中,您需要执行以下操作:
my $dbh = DBI->connect(...);
$dbh->begin_work(); # This is BEGIN TRANSACTION;
my $sth = $dbh->prepare(
"SELECT id,name FROM mytable WHERE booled=0");
$sth->execute();
while (my $row = $sth->fetchrow_hashref()) {
# do something with fetched $row...
}
$sth->finish();
$dbh->do("UPDATE mytable SET booled=1 WHERE booled=0");
$dbh->commit(); # This is implicit COMMIT TRANSACTION;