0

選択と更新を同時に行うことは可能ですか?

select id,name from mytable where booled = 0

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

つまり、これら 2 つのコマンドを 1 つにまとめることができます。

4

4 に答える 4

4

車輪を再発明する必要はありません。トランザクションを適切に使用するだけで済みます。テーブルに 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;
于 2013-08-09T10:56:58.843 に答える
0

「EXISTS」を利用できます..「In」よりもはるかに高速です

ブール = 0 の mytable から ID、名前を選択します。
UPDATE mytable t1
SET boled=1 WHERE exists (
booled = 0 および
t1.column=t2.column(join condition) である mytable t2 から 1 を選択);

于 2013-08-09T10:35:26.483 に答える