Un MERGE dans MariaDB / MySQL

Un MERGE dans MariaDB / MySQLL’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);

Base de données  / Formateur MariaDB Formateur MySQL Formateur SQL Formateur Transact SQL MariaDB MySQL SQL Transact SQL 

Commentaires

Bonjour,
Sous postgres la fonctionnalité existe depuis la version 9.5 :
http://www.postgresql.org/docs/9.5/static/sql-insert.html#SQL-ON-CONFLICT

Pour l’explication du pourquoi de la syntaxe : https://wiki.postgresql.org/wiki/UPSERT#SQL_MERGE_syntax

Hélas, sur MariaDB / MySQL ou sur PostgreSQL, il n’y a pas la prise en charge du DELETE comme sur SQL Server, Oracle ou Firebird 3.0 !

Laisser un commentaire

(requis)

(requis)