suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Wie implementiert man die Operation „Einfügen, wenn nicht vorhanden“ in MySQL?

<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>
P粉005105443P粉005105443495 Tage vor557

Antworte allen(2)Ich werde antworten

  • P粉338969567

    P粉3389695672023-08-30 10:05:32

    解决方案:

    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`)

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

    Antwort
    0
  • P粉521013123

    P粉5210131232023-08-30 00:40:11

    使用INSERT IGNORE INTO table

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


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

    Antwort
    0
  • StornierenAntwort