Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment puis-je faire 'insérer s'il n'existe pas' dans MySQL?

Utilisez INSERT IGNORE INTO table .

Il y a aussi INSERT … ON DUPLICATE KEY UPDATE syntaxe, et vous pouvez trouver des explications dans 13.2.6.2 Instruction INSERT ... ON DUPLICATE KEY UPDATE .

Message de bogdan.org.ua selon Le cache Web de Google :

18 octobre 2007

Pour commencer :depuis le dernier MySQL, la syntaxe présentée dans le titre n'est plus possible. Mais il existe plusieurs façons très simples d'accomplir ce qui est attendu en utilisant les fonctionnalités existantes.

Il y a 3 solutions possibles :utiliser INSERT IGNORE, REPLACE ou INSERT … ON DUPLICATE KEY UPDATE.

Imaginez que nous ayons une table :

CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Imaginons maintenant que nous ayons un pipeline automatique important les métadonnées des transcriptions depuis Ensembl, et que pour diverses raisons, le pipeline puisse être interrompu à n'importe quelle étape de l'exécution. Ainsi, nous devons nous assurer de deux choses :

  1. les exécutions répétées du pipeline ne détruiront pas notre> base de données
  1. les exécutions répétées ne mourront pas en raison d'erreurs de "clé primaire en double".

Méthode 1 :utiliser REMPLACER

C'est très simple :

REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;

Si l'enregistrement existe, il sera écrasé; s'il n'existe pas encore, il sera créé. Cependant, l'utilisation de cette méthode n'est pas efficace dans notre cas :nous n'avons pas besoin d'écraser les enregistrements existants, il suffit de les ignorer.

Méthode 2 :utiliser INSERT IGNORE Aussi très simple :

INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;

Ici, si « ensembl_transcript_id » est déjà présent dans la base de données, il sera silencieusement ignoré (ignoré). (Pour être plus précis, voici une citation du manuel de référence de MySQL :"Si vous utilisez le mot-clé IGNORE, les erreurs qui se produisent lors de l'exécution de l'instruction INSERT sont traitées comme des avertissements. Par exemple, sans IGNORE, une ligne qui duplique un index UNIQUE existant ou une CLÉ PRIMAIRE valeur dans la table provoque une erreur de clé en double et l'instruction est abandonnée.") Si l'enregistrement n'existe pas encore, il sera créé.

Cette deuxième méthode présente plusieurs faiblesses potentielles, notamment le non-abandon de la requête en cas de problème (voir le manuel). Il doit donc être utilisé s'il a déjà été testé sans le mot-clé IGNORE.

Méthode 3 :utilisation de INSERT… ON DUPLICATE KEY UPDATE :

La troisième option consiste à utiliser INSERT … ON DUPLICATE KEY UPDATE syntaxe, et dans la partie UPDATE, ne faites rien, faites une opération sans signification (vide), comme calculer 0 + 0 (Geoffray suggère de faire l'affectation id=id pour que le moteur d'optimisation MySQL ignore cette opération). L'avantage de cette méthode est qu'elle ignore uniquement les événements duplicatekey et qu'elle s'interrompt toujours en cas d'autres erreurs.

Comme dernier avis :ce message a été inspiré par Xaprb. Je vous conseille également de consulter son autre article sur l'écriture de requêtes SQL flexibles.