Un MERGE dans MariaDB / MySQL
L’instruction MERGE qui permet de fusionner les données d’une table à partir des données du contenu d’une autre table n’existe pas dans MariaDB / MySQL. Elle n’existe pas non plus dans PostgreSQL ! Elle existe dans Oracle Database, Microsoft SQL Server et Firebird.
Sous MariaDB / MySQL, vous disposez de la commande SQL INSERT … ON DUPLICATE KEY UPDATE.
Script de création de tables
Créez deux tables sur le modèle du script fourni ci-dessous :
CREATE TABLE `societe` ( `societe_id` int(6) NOT NULL AUTO_INCREMENT, `societe_raisonsociale` varchar(50) NOT NULL, `societe_cp` int(6) NOT NULL, `societe_ville` varchar(50) DEFAULT NULL, PRIMARY KEY (`societe_id`), UNIQUE KEY `societe_uk` (`societe_raisonsociale`,`societe_cp`), KEY `societe_ix_ville` (`societe_ville`), KEY `societe_ix_raisonsociale` (`societe_ville`), KEY `societe_ix_cp` (`societe_cp`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1; CREATE TABLE `client` ( `client_id` int(6) NOT NULL AUTO_INCREMENT, `client_raisonsociale` varchar(50) NOT NULL, `client_cp` int(6) NOT NULL, `client_ville` varchar(50) DEFAULT NULL, PRIMARY KEY (`client_id`), UNIQUE KEY `client_uk` (`client_raisonsociale`,`client_cp`), KEY `client_idx_ville` (`client_ville`), KEY `client_idx_raisonsociale` (`client_ville`), KEY `client_idx_cp` (`client_cp`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
La fusion des tables
Après avoir alimenté la table client par un jeu d’essai, exécutez l’ordre SQL suivant pour copier dans la table societe les données de client :
INSERT INTO societe (societe_raisonsociale,societe_cp,societe_ville) SELECT client_raisonsociale,client_cp,client_ville FROM client
Modifiez ensuite la ville de l’une des lignes de la table client et exécutez l’ordre de fusion des deux tables :
INSERT INTO societe (societe_raisonsociale,societe_cp,societe_ville) SELECT client_raisonsociale,client_cp,client_ville FROM client ON DUPLICATE KEY UPDATE societe_ville=VALUES(societe_ville);