🔒 Connexion

♻️ Rendre un script SQL rejouable

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.

Déposez ici un fichier .sql, ou cliquez pour le choisir — ou collez le script ci-dessous.

Ce que « rejouable » veut dire

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.

Ce que l'outil transforme

La limite, dite franchement

Rendre 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.

Les trois stratégies d'insertion

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.

Questions fréquentes

L'outil convertit-il MySQL vers Oracle ?
Non, et c'est délibéré. Il rend un script rejouable dans son propre dialecte. Traduire d'un moteur à l'autre est un travail différent, que l'outil de migration de version traite séparément. Si vous choisissez une cible qui ne correspond pas au fichier, l'outil le détecte et le signale plutôt que de produire un fichier inexécutable.
Pourquoi MySQL et MariaDB sont-ils traités différemment ?
MariaDB accepte 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.
Et les UPDATE ?
Un 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.
Que fait-il d'un TRUNCATE ?
Il le laisse et le signale. Un 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.
Mon fichier est-il envoyé quelque part ?
Non. Toute l'analyse se fait en JavaScript dans votre navigateur. Vous pouvez le vérifier dans l'onglet Réseau de vos outils de développement : aucune requête n'est émise pendant la transformation.