如何在MySQL中实现'如果不存在则插入”的操作?
P粉005105443
P粉005105443 2023-08-29 10:59:40
0
2
480
<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>
P粉005105443
P粉005105443

全部回复(2)
P粉338969567

解决方案:

INSERT INTO `table` (`value1`, `value2`) 
SELECT 'stuff for value1', 'stuff for value2' FROM DUAL 
WHERE NOT EXISTS (SELECT * FROM `table` 
      WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1)

说明:

最里面的查询

SELECT * FROM `table` 
      WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1

用作WHERE NOT EXISTS条件,检测是否已存在包含要插入数据的行。找到此类的一行后,查询可能会停止,因此LIMIT 1(微优化,可以省略)。

中间查询

SELECT 'stuff for value1', 'stuff for value2' FROM DUAL

代表要插入的值。 DUAL 是指所有 Oracle 数据库中默认存在的一种特殊的单行单列表(请参阅 https://en.wikipedia.org/wiki/DUAL_table)。在 MySQL-Server 版本 5.7.26 上,当省略 FROM DUAL 时,我得到了有效的查询,但旧版本(如 5.5.60)似乎需要 FROM 信息。通过使用 WHERE NOT EXISTS,如果最里面的查询找到匹配的数据,中间查询将返回一个空结果集。

外部查询

INSERT INTO `table` (`value1`, `value2`)

插入数据(如果中间查询返回任何数据)。

P粉521013123

使用INSERT IGNORE INTO table

还有 INSERT … ON DUPLICATE KEY UPDATE 语法,您可以在 13.2.6.2 INSERT ... ON DUPLICATE KEY UPDATE 语句


来自 bogdan 的帖子.org.ua 根据Google 的网络缓存

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!