1

如果我的临时表temp中有 1 条或多条记录,我想在我的表中插入一行。通常情况下,如果行存在,我想更新,否则插入。那么我将如何解决这个问题?似乎没有我可以使用的if exists语句,并且快速搜索显示INSERT INTO不支持where -clause。

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没有子句的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 回答