繁体   English   中英

如果一行的所有列条目都不存在,MySQL插入表

[英]MySQL insert into table if all columns entry for a row does not exists

因此,我试图避免调用该表,看看是否有该条目以便插入新行或对其进行更新。 我正在尝试以下查询,但是出现语法错误。 有人可以帮忙吗?

这是我的查询:

IF(
  NOT EXISTS(
    SELECT
        *
    FROM
        ranking_rank_data
    WHERE
        rank = '1'
    AND source_id = '1'
    AND ranking_school_id = '2'
  )
) THEN INSERT INTO 
     ranking_rank_data (rank, source_id, ranking_source_id VALUES ('1','2','3')
END IF;

您可以使用INSERT ... SELECT查询,从虚拟表DUAL中选择,然后将where子句放在那里,如果条件为false,则不会插入任何行:

INSERT INTO ranking_rank_data (rank, source_id, ranking_source_id)
SELECT '1','2','3'
FROM dual
WHERE
  NOT EXISTS(SELECT *
             FROM ranking_rank_data
             WHERE rank = '1' AND source_id = '1' AND ranking_school_id = '2')

请看这里的小提琴。

为什么不使用INSERT ON DUPLICATE KEY UPDATE语法并在rank + source_id + ranking_school_id上设置唯一键? 如果您没有“真正”更新的内容,则可以更新一个虚拟字段。 参见https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

您也可以尝试将其插入。 如果键重复,它将失败,但是您可以使用在MySQL之上使用的编程语言来处理此错误。

您还可以通过在三个值上创建唯一索引来执行此操作:

create unique index on ranking_rank_data_rank_source_id_ranking_source_id on
    ranking_rank_data(rank, source_id, ranking_source_id);

这样可以防止重复。 然后,您可以插入没有重复的记录(或更新记录)。 有两种方法(除not exists方法外)来执行此操作。 第一个是insert ignore

INSERT IGNORE INTO ranking_rank_data (rank, source_id, ranking_source_id)
SELECT '1','2','3';

这将忽略所有错误,而不仅仅是重复错误,因此我更喜欢第二种方法,该方法用于on duplicate key update

INSERT IGNORE INTO ranking_rank_data(rank, source_id, ranking_source_id)
    SELECT '1','2','3'
    ON DUPLICATE KEY UPDATE rank = values(rank);

update语句是无操作的,可以忽略该错误。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM