如何在MySQL中实现'如果不存在则插入”的操作?
P粉005105443
2023-08-29 10:59:40
<p>我首先通过谷歌搜索找到了这篇文章<em>如何在标准 SQL 中编写 INSERT if NOT EXISTS 查询</em>,其中讨论了互斥表。</p>
<p>我有一个包含约 1400 万条记录的表。如果我想以相同的格式添加更多数据,有没有一种方法可以确保我想要插入的记录不存在,而不使用一对查询(即,一个要检查的查询和一个要插入的查询,结果集是空)?</p>
<p>字段上的 <code>unique</code> 约束是否保证 <code>insert</code> 如果已经存在就会失败?</p>
<p>看起来<em>仅仅是</em>一个约束,当我通过 PHP 发出插入时,脚本会发出嘎嘎声。</p>
解决方案:
说明:
最里面的查询
用作
WHERE NOT EXISTS
条件,检测是否已存在包含要插入数据的行。找到此类的一行后,查询可能会停止,因此LIMIT 1
(微优化,可以省略)。中间查询
代表要插入的值。
DUAL
是指所有 Oracle 数据库中默认存在的一种特殊的单行单列表(请参阅 https://en.wikipedia.org/wiki/DUAL_table)。在 MySQL-Server 版本 5.7.26 上,当省略FROM DUAL
时,我得到了有效的查询,但旧版本(如 5.5.60)似乎需要FROM
信息。通过使用WHERE NOT EXISTS
,如果最里面的查询找到匹配的数据,中间查询将返回一个空结果集。外部查询
插入数据(如果中间查询返回任何数据)。
使用
INSERT IGNORE INTO table
。还有
INSERT … ON DUPLICATE KEY UPDATE
语法,您可以在 13.2.6.2 INSERT ... ON DUPLICATE KEY UPDATE 语句。来自 bogdan 的帖子.org.ua 根据Google 的网络缓存: