一時テーブルtempに 1 つ以上のレコードがある場合、テーブルに行を挿入したいと考えています。通常、行が存在する場合は更新し、そうでない場合は挿入したい場所の逆です。それで、どうすればこれを解決できますか?私が使用できるif existsステートメントがあるようには見えません。クイック検索では、 INSERT INTOがwhere句をサポートしていないことがわかります。
2 に答える
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
、句のない句をサポートしていませんfrom
。from
これは、句を使用して一時テーブルのカウントを計算することで、その問題を解決します。カウントが 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(*) ...
、毎回すべての行をカウントする必要があります。
一時テーブルに多くの行を含めることができない場合、利点があったとしても、ほとんど目立たないでしょう。