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

如果一行的所有列条目都不存在,则将MySQL插入表中,mysql,if-statement,exists,sql-insert,Mysql,If Statement,Exists,Sql Insert,因此,我试图避免调用表,查看是否有条目,以便插入新行或更新它。我正在尝试下面的查询,但出现语法错误。有人能帮忙吗 我的问题是: IF( NOT EXISTS( SELECT * FROM ranking_rank_data WHERE rank = '1' AND source_id = '1' AND ranking_school_id = '2' ) ) THEN INSERT INTO

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

我的问题是:

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;

您可以使用插入。。。选择查询,从dummy table 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')

请参阅fiddle。

为什么不使用
在重复密钥更新时插入
语法,并在
等级
+
源id
+
等级(学校id
)上设置唯一密钥?如果没有“真正”更新的内容,可以更新虚拟字段。看


您也可以尝试插入它。它将在复制键时失败,但您可以在MySQL上使用的编程语言中处理此错误。

您也可以通过在三个值上创建唯一索引来完成此操作:

create unique index on ranking_rank_data_rank_source_id_ranking_source_id on
    ranking_rank_data(rank, source_id, ranking_source_id);
这将防止重复。然后,您可以插入(或更新)没有重复的记录。有两种方法(除了
不存在
方法)可以做到这一点。第一个是插入忽略:

INSERT IGNORE INTO ranking_rank_data (rank, source_id, ranking_source_id)
SELECT '1','2','3';
这会忽略所有错误,而不仅仅是重复错误,因此我更喜欢第二种方法,它在重复密钥更新时使用

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

(update语句是一个忽略错误的no-op语句。)

我确实试过了。但我只想要一个条件,即如果这三个字段的值都与插入值相同,则不会插入,这些字段中的任何一个字段都是唯一的。