数据库更新并同时选择

时间:2013-08-09 10:23:15

标签: mysql sql

是否可以同时进行选择和更新?

select id,name from mytable where booled = 0

UPDATE mytable SET booled=1 WHERE (select id,name from mytable where booled = 0)

所以说这两个命令合二为一。

4 个答案:

答案 0 :(得分:4)

为什么不呢?

UPDATE mytable SET booled=1 WHERE booled=0

答案 1 :(得分:4)

没有必要重新发明轮子 - 您只需要正确使用交易。只要您为表使用InnoDB引擎(旧的MyISAM不起作用),MySQL就支持事务。

以下一系列陈述可以满足您的需求:

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;

答案 2 :(得分:0)

尝试用分号分隔两个语句:

select id,name from mytable where booled = 0;
UPDATE mytable SET booled=1 WHERE (select id,name from mytable where booled = 0);

答案 3 :(得分:0)

你可以使用'EXISTS'..比“In”

快得多
  

选择id,来自mytable的名称,其中booled = 0;
  更新mytable t1
  SET booled = 1   在哪里(从mytable t2中选择1)   其中booled = 0和
  t1.column = t2.column(join condition));