如果行的所有列条目不存在,则 MySQL 插入表
Posted
技术标签:
【中文标题】如果行的所有列条目不存在,则 MySQL 插入表【英文标题】:MySQL insert into table if all columns entry for a row does not exists 【发布时间】:2014-03-18 21:56:41 【问题描述】:所以我试图避免调用表,看看我是否有条目以便插入新行或更新它。我正在尝试以下查询,但出现语法错误。有人可以帮忙吗?
这是我的查询:
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;
【问题讨论】:
【参考方案1】:您可以使用 INSERT ... SELECT 查询,从虚拟表 DUAL 中选择并将 where 子句放在那里,如果条件为假,则不会插入任何行:
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')
请看小提琴here。
【讨论】:
【参考方案2】:您也可以通过在三个值上创建唯一索引来做到这一点:
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
语句是忽略错误的无操作。)
【讨论】:
【参考方案3】:为什么不使用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 之上使用您使用的编程语言处理此错误。
【讨论】:
我确实试过了。但我只想要一个条件,如果所有三个都具有与插入值相同的值而不被插入,那么这些字段都不是唯一的。 我说的是在多个列上设置唯一键,而不是在每一列上。以上是关于如果行的所有列条目不存在,则 MySQL 插入表的主要内容,如果未能解决你的问题,请参考以下文章
sql 示例:如果行存在,则如何更新行或如果行不存在则插入行