Comprendre les insertions conditionnelles dans MySQL
Les instructions d'insertion conditionnelles vous permettent d'insérer une nouvelle ligne dans une table uniquement si certaines conditions sont remplies. Dans MySQL, il n'existe pas de syntaxe dédiée pour les insertions conditionnelles, mais vous pouvez obtenir le même résultat en utilisant des techniques telles que les sous-requêtes et l'instruction MERGE.
Exemple de scénario : éviter les insertions en double
Considérez un scénario dans lequel vous disposez d'une table appelée x_table avec des colonnes (instance, utilisateur, élément). La colonne d'instance est unique et vous souhaitez éviter d'insérer des lignes en double là où un utilisateur spécifique possède déjà un élément donné.
Par exemple, disons que vous souhaitez insérer la ligne (instance=919191, user=123, item=456) si et seulement s'il n'y a pas d'autres lignes dans x_table avec user=123 et item=456.
Utilisation de la sous-requête et de la sélection de ligne
Pour y parvenir, vous pouvez utiliser une sous-requête pour vérifier l'existence de la ligne en double :
INSERT INTO x_table(instance, user, item) SELECT 919191, 123, 456 FROM dual WHERE NOT EXISTS (SELECT * FROM x_table WHERE user = 123 AND item = 456)
Dans cette instruction, dual est une table spéciale avec une seule ligne (trouvée à l'origine dans Oracle et désormais également disponible dans MySQL). La sous-requête dans l'instruction SELECT sélectionne une seule ligne de données, mais uniquement si les valeurs n'existent pas déjà dans x_table.
Alternative : utilisation de l'instruction MERGE
MySQL a également introduit une instruction MERGE dédiée dans la version 8.0, qui fournit un moyen pratique de gérer les insertions, mises à jour et suppressions conditionnelles en un seul clic. instruction :
MERGE INTO x_table (instance, user, item) USING ( SELECT 919191, 123, 456 WHERE NOT EXISTS (SELECT * FROM x_table WHERE user = 123 AND item = 456) ) AS new_row ON x_table.user = new_row.user AND x_table.item = new_row.item WHEN NOT MATCHED THEN INSERT (instance, user, item) VALUES (new_row.instance, new_row.user, new_row.item);
L'instruction MERGE utilise une sous-requête similaire à l'exemple précédent pour vérifier l'existence de la ligne en double. Si la ligne n'existe pas (WHEN NOT MATCHED), alors elle exécute une opération d'insertion.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!