1

1 つのクエリで複数の行を更新する必要があります。挿入については、通常、次のようなことを行います

INSERT INTO `table` (c1,c2,c3) VALUES 
 (1,2,3),
 (4,5,6),
 ..

しかし、各行が他の行とは異なる値を持つ更新に対して、どうすれば同様のことを行うことができるでしょうか? そして、各行のIDに関連する条件はありますか?

同様の問題に直面した人はいますか?

今すぐ更新を行う方法の例は次のとおりです。

UPDATE questions
SET lab='What sections do you believe the site must not have?',
    type='textarea',
    options=''
WHERE rnum=11;

UPDATE questions
SET lab='What is your favourate section?',
    type='radio',
    options='section1,section2,section3,section4,section5'
WHERE rnum=12;

等々。すべてのクエリを実行する必要があり、20 ものクエリが実行される可能性があるため、これは間違いなく最悪の方法です。

4

5 に答える 5

4

プレースホルダーを使用すると、同じクエリを何度も実行できます。

my @data = (
  [ 'new_lab1', 'new_type1', 'new_opt1', 1 ],
  [ 'new_lab2', 'new_type2', 'new_opt2', 2 ],
);

my $sql = <<EOT;
UPDATE questions
SET lab=?,
    type=?,
    options=?
WHERE rnum=?
EOT

my $sth = $dbh->prepare($sql);
for my $datum (@data) {
    $sth->execute(@$datum);
}
于 2010-06-29T16:06:04.223 に答える
1

まず、なぜこれを 1 つのクエリで行う必要があるのでしょうか。更新をアトミックに行う必要がある場合は、それらをSTART TRANSACTION;andでラップできますCOMMIT;か? それはおそらく私がすることです。

ただし、これを 1 つのクエリで実行する必要があり、更新する行の数がかなり少ない場合は、実行できます。おそらく、この醜い小さなトリックを使用できます。

UPDATE questions
SET
lab = IF(rnum=11, 'What sections...?',
        IF(rnum=12, 'What is your...?',
          IF(rnum=13, 'Etc.',
            NULL
          )
        )
      ),
type = IF(rnum=11, 'textarea',
         IF(rnum=12, 'radio',
           IF(rnum=13, 'Etc.',
             NULL
           )
         )
       )
WHERE rnum IN (11, 12, 13);

ループを perl で書いて、その性質のフリークを構築することは、演習として残されています :)

正しく記述し、テーブルが信じているとおりであれば、残りの NULL は決して使用しないでください。NOT NULL安全性を高めるために、可能であれば、これらの列のいくつかを であると宣言することをお勧めします。これによりrnum、一致しない場合、割り当てによって制約が失敗し、UPDATEが中止されます。

于 2010-08-14T18:25:26.883 に答える
0

次の例を検討してください。列 'col_name' のすべての値をインクリメントします。その id > 5 および col_name は 0 ではありません

id    col_name
1       1
5       2
6       3
7       5
8       6
9       7
10      0

クエリ

update tbl_name SET col_name=col_name+1 where id > 5 and col_name !=0

O/Pは

id    col_name
1       1
5       2
6       4
7       6
8       7
9       8
10      0
于 2010-06-29T14:55:26.663 に答える
0

あるテーブルを別のテーブルの値で更新する場合は、次のように簡単です。

update table1,table2
SET table1.value = table2.value
WHERE table1.key = table2_foreign_key

一貫した方法で行のサブセットを変更して 1 つのテーブルを更新する場合は、次のように簡単です。

update table1
SET table1.value = (table1.value * 2)
WHERE table1.id in (SELECT id from table1 where table1.key > 50);

2 番目のテーブルを使用せずに、各レコードが異なる方法で更新される 1 つのテーブルで複数のレコードを更新しようとしている場合、それは基本的に不可能です。コードでそれを行うほうがよいでしょう。

于 2010-06-29T15:05:41.727 に答える