如果我的临时表temp中有 1 条或多条记录,我想在我的表中插入一行。通常情况下,如果行存在,我想更新,否则插入。那么我将如何解决这个问题?似乎没有我可以使用的if exists语句,并且快速搜索显示INSERT INTO不支持where -clause。
问问题
985 次
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
没有子句的from
子句。from
这通过使用子句计算临时表中的计数来解决该问题。如果计数大于 0(或您想要的任何数字),则插入该行。
于 2013-05-26T14:59:52.883 回答
0
就像@Gordon Linoff 的回答一样,以下内容基于使用INSERT...SELECT
而不是相同的想法INSERT...VALUES
,因为前者允许人们抛出 WHERE 条件。但是,我会以不同的方式解决 WHERE without FROM 的限制问题:
INSERT INTO target_table (list_of_columns)
SELECT *
FROM (SELECT list_of_values) s
WHERE EXISTS (SELECT * FROM temp_table)
;
如果临时表可能包含许多行,这可能比 Gordon 的建议执行得更好,因为EXISTS (SELECT * ...)
当至少有一行与子查询匹配时不需要扫描整个表,而SELECT COUNT(*) ...
每次都需要计算所有行。
如果临时表中的行数不多,那么优势(如果有的话)可能不明显。
于 2013-05-26T17:45:40.010 回答