1

一時テーブルtempに 1 つ以上のレコードがある場合、テーブルに行を挿入したいと考えています。通常、行が存在する場合は更新し、そうでない場合は挿入したい場所の逆です。それで、どうすればこれを解決できますか?私が使用できるif existsステートメントがあるようには見えません。クイック検索では、 INSERT INTOがwhere句をサポートしていないことがわかります。

4

2 に答える 2

4

insert into確実にwhere句をサポートします。insert into . . . select次の形式を使用するだけです。

insert into mytable(<whatever>)
    select <whatever>
    from (select count(*) as cnt from temp) c
    where c.cnt > 0;

技術的には、where句は の一部ですがselect、それはあなたが望むことをします。

MySQL はwhere、句のない句をサポートしていませんfromfromこれは、句を使用して一時テーブルのカウントを計算することで、その問題を解決します。カウントが 0 (または任意の数) より大きい場合、行が挿入されます。

于 2013-05-26T14:59:52.883 に答える
0

@Gordon Linoff の answerと同様に、以下は のINSERT...SELECT代わりにを使用するという同じ考え方に基づいていINSERT...VALUESます。前者では WHERE 条件をスローできるためです。ただし、FROM を使用せずに WHERE の制限を回避するという問題には、次のように別の方法でアプローチします。

INSERT INTO target_table (list_of_columns)
SELECT *
FROM (SELECT list_of_values) s
WHERE EXISTS (SELECT * FROM temp_table)
;

EXISTS (SELECT * ...)一時テーブルが多くの行を保持する可能性がある場合、サブクエリに一致する行が少なくとも 1 つある場合はテーブル全体をスキャンする必要がないため、Gordon の提案よりもパフォーマンスが向上する可能性がありますがSELECT COUNT(*) ...、毎回すべての行をカウントする必要があります。

一時テーブルに多くの行を含めることができない場合、利点があったとしても、ほとんど目立たないでしょう。

于 2013-05-26T17:45:40.010 に答える