如果临时表中存在行,则插入MySQL

时间:2013-05-26 14:54:42

标签: mysql

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

3 个答案:

答案 0 :(得分: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的一部分,但它可以满足您的需求。

如果没有where子句,MySQL不支持from子句。这通过使用from子句计算临时表中的计数来解决该问题。如果计数大于0(或您想要的任何数字),则它会插入行。

答案 1 :(得分:0)

@Gordon Linoff's 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)
;

如果临时表可能包含很多行,这可能比Gordon的建议更好,因为当EXISTS (SELECT * ...)至少有一行与子查询匹配时,SELECT COUNT(*) ...不需要扫描整个表,而{{1需要每次都计算所有行。

如果临时表中没有多行,那么优势(如果有的话)可能不会引起注意。

答案 2 :(得分:-2)