如果一行的所有列条目都不存在,则将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语句。)我确实试过了。但我只想要一个条件,即如果这三个字段的值都与插入值相同,则不会插入,这些字段中的任何一个字段都是唯一的。