選択と更新を同時に行うことは可能ですか?
select id,name from mytable where booled = 0
UPDATE mytable SET booled=1 WHERE (select id,name from mytable where booled = 0)
つまり、これら 2 つのコマンドを 1 つにまとめることができます。
車輪を再発明する必要はありません。トランザクションを適切に使用するだけで済みます。テーブルに 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;
「EXISTS」を利用できます..「In」よりもはるかに高速です
ブール = 0 の mytable から ID、名前を選択します。
UPDATE mytable t1
SET boled=1 WHERE exists (
booled = 0 および
t1.column=t2.column(join condition) である mytable t2 から 1 を選択);