Maison  >  Questions et réponses  >  le corps du texte

Comment implémenter l'opération « insérer s'il n'existe pas » dans MySQL ?

<p>J'ai trouvé cet article pour la première fois grâce à une recherche Google, <em>Comment écrire une requête INSERT if NOT EXISTS en SQL standard</em>, qui traite des tables mutex. </p> <p>J'ai une table contenant environ 14 millions d'enregistrements. Si je souhaite ajouter plus de données dans le même format, existe-t-il un moyen de garantir que l'enregistrement que je souhaite insérer n'existe pas sans utiliser une paire de requêtes (c'est-à-dire une requête à vérifier et une requête à insérer, avec le jeu de résultats est vide)? </p> La contrainte <code>unique</code> sur le champ <p> garantit-elle que <code>insert</code> </p> <p>On dirait que <em> est juste </em> une contrainte, et lorsque j'émets l'insertion via PHP, le script tremble. </p>
P粉005105443P粉005105443418 Il y a quelques jours501

répondre à tous(2)je répondrai

  • P粉338969567

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

    Solution :

    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)

    Instructions :

    La requête la plus intime

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

    est utilisé comme WHERE NOT EXISTS条件,检测是否已存在包含要插入数据的行。找到此类的一行后,查询可能会停止,因此LIMIT 1 (micro-optimisation, peut être omis).

    Requête intermédiaire

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

    représente la valeur à insérer. DUAL 是指所有 Oracle 数据库中默认存在的一种特殊的单行单列表(请参阅 https://en.wikipedia.org/wiki/DUAL_table)。在 MySQL-Server 版本 5.7.26 上,当省略 FROM DUAL 时,我得到了有效的查询,但旧版本(如 5.5.60)似乎需要 FROM 信息。通过使用 WHERE NOT EXISTS, si la requête la plus interne trouve des données correspondantes, la requête du milieu renverra un ensemble de résultats vide.

    Requête externe

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

    Insérer des données (si la requête intermédiaire renvoie des données).

    répondre
    0
  • P粉521013123

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

    Utilisez INSERT IGNORE INTO table.

    Il existe également une syntaxe INSERT … ON DUPLICATE KEY UPDATE que vous pouvez utiliser dans l'instruction 13.2.6.2 INSERT ... ON DUPLICATE KEY UPDATE .


    Post de bogdan.org.ua Basé sur le cache Web de Google :

    répondre
    0
  • Annulerrépondre