Un script qui plante à la seconde exécution n'est pas déployable. Cet outil ajoute
les protections qui manquent — IF NOT EXISTS, IF EXISTS,
insertions conditionnées sur la clé primaire — et vous dit ce qu'il n'a pas pu
traiter. Tout se passe dans votre navigateur : votre dump n'est envoyé nulle part.
Un script est rejouable — on dit aussi idempotent — lorsque l'exécuter deux fois laisse la base dans le même état que l'exécuter une fois. C'est ce qu'exige tout déploiement sérieux : un import interrompu doit pouvoir être relancé sans devoir d'abord réparer à la main ce que la première tentative a déjà écrit.
Les scripts produits par phpMyAdmin ou mysqldump ne le sont pas. Ils supposent une
base vide. Relancés sur une base déjà remplie, ils échouent sur le premier
CREATE TABLE, ou pire, dupliquent silencieusement des lignes.
CREATE TABLE, CREATE DATABASE, CREATE INDEX → ajout de IF NOT EXISTSDROP de toute nature → ajout de IF EXISTSCREATE VIEW → CREATE OR REPLACE VIEWDROP … IF EXISTSALTER TABLE à clauses multiples → éclaté en instructions séparées, chacune protégéeINSERT → conditionné sur la clé primaire ou une contrainte unique lue dans le fichierRendre un INSERT rejouable suppose de savoir ce qui identifie une ligne.
Aucune analyse du texte ne peut le deviner : « la même ligne » est une notion métier,
pas grammaticale. L'outil s'en tire parce qu'un export contient presque toujours la
réponse — le CREATE TABLE et la clé primaire voyagent avec les données.
Quand la clé reste introuvable, ou qu'elle est auto-incrémentée et absente des valeurs
insérées, l'instruction est recopiée telle quelle et signalée « à reprendre ». Un
INSERT transformé sur une mauvaise clé écraserait des données : mieux vaut
échouer visiblement que deviner.
N'insérer que si la ligne est absente — l'option par défaut. Elle
produit un INSERT … SELECT … WHERE NOT EXISTS. Son avantage : elle ne
réclame aucun index unique en base, seulement une colonne sur laquelle tester. Elle
fonctionne donc même sur une table dont la contrainte n'a pas encore été créée.
INSERT INTO clients (id, nom) SELECT 1 AS id, 'Dupont' AS nom FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM clients WHERE clients.id = 1);
INSERT IGNORE — plus court, mais il exige une contrainte unique réellement déclarée, et il fait taire au passage les troncatures de données et les violations de clé étrangère. Une erreur réelle passe alors inaperçue.
Insérer ou mettre à jour — ajoute un ON DUPLICATE KEY UPDATE.
Le rejeu écrase les valeurs existantes : c'est ce qu'on veut pour un jeu de référence,
c'est gênant si la ligne a pu être modifiée depuis.
IF NOT EXISTS sur l'ajout d'une colonne
ou d'un index ; MySQL 8 ne l'accepte pas. Pour MySQL, l'outil génère à la place un test
sur information_schema suivi d'une instruction préparée. Le résultat est
équivalent, mais le code est plus verbeux — ce n'est pas un défaut de l'outil.UPDATE est en général déjà idempotent : poser une
valeur fixe donne le même résultat à chaque passage. L'exception est l'assignation qui
se lit elle-même — SET compteur = compteur + 1. L'outil la détecte et la
signale ; il ne la réécrit pas, car il n'existe pas de forme équivalente automatique.TRUNCATE est
techniquement idempotent, mais rejoué après un import réussi il vide la table avant de
la remplir. Si votre script doit compléter des données existantes, c'est exactement ce
qu'il ne faut pas.