Wie implementiert man die Operation „Einfügen, wenn nicht vorhanden' in MySQL?
P粉005105443
2023-08-29 10:59:40
<p>Ich habe diesen Artikel zum ersten Mal über eine Google-Suche gefunden, <em>So schreibe ich eine INSERT if NOT EXISTS-Abfrage in Standard-SQL</em>, in dem Mutex-Tabellen behandelt werden. </p>
<p>Ich habe eine Tabelle mit etwa 14 Millionen Datensätzen. Wenn ich weitere Daten im gleichen Format hinzufügen möchte, gibt es eine Möglichkeit sicherzustellen, dass der Datensatz, den ich einfügen möchte, nicht vorhanden ist, ohne ein Abfragepaar zu verwenden (d. h. eine zu prüfende Abfrage und eine einzufügende Abfrage mit dem Ergebnissatz). ist leer)? </p>
Garantiert die <code>unique</code>-Einschränkung für das <p>-Feld, dass <code>insert</code> fehlschlägt? </p>
<p>Sieht so aus, als ob <em> nur eine Einschränkung ist und wenn ich die Einfügung über PHP ausführe, klappert das Skript. </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 的网络缓存: