[英]Insert a MySQL row only if the data in the specific columns does not already exists in the table somewhere
[英]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.