Modifier l'ancienne ligne
REPLACE supprime l'ancienne ligne (ou les anciennes lignes), puis insère la nouvelle. Mais parfois, ce qu'on veut, c'est bien
modifier la ligne déjà existante. C'est possible grâce à la clause ON DUPLICATE KEY UPDATE de la commande INSERT.
Syntaxe
Voici donc la syntaxe de INSERT INTO avec cette fameuse clause :
Code : SQL
INSERT INTO nom_table [(colonne1, colonne2, colonne3)]
VALUES (valeur1, valeur2, valeur3)
ON DUPLICATE KEY UPDATE colonne2 = valeur2 [, colonne3 = valeur3];
Donc, si une contrainte d'unicité est violée par la requête d'insertion, la clause ON DUPLICATE KEY va aller modifier les
colonnes spécifiées dans la ligne déjà existante.
Exemple : revoici notre petit Spoutnik !
Code : SQL
SELECT id, sexe, date_naissance, nom, espece_id, mere_id, pere_id
FROM Animal
WHERE nom = 'Spoutnik';
id sexe date_naissance
nom
espece_id mere_id pere_id
32 M
2009-07-26 11:52:00 Spoutnik 3
NULL
NULL
Essayons d'insérer une autre tortue du nom de Spoutnik, mais cette fois-ci avec la nouvelle clause.
Code : SQL
INSERT INTO Animal (sexe, date_naissance, espece_id, nom, mere_id)
VALUES ('M', '2010-05-27 11:38:00', 3, 'Spoutnik', 52) -date_naissance et mere_id sont différents du Spoutnik existant
ON DUPLICATE KEY UPDATE mere_id = 52;
SELECT id, sexe, date_naissance, nom, espece_id, mere_id, pere_id
FROM Animal
WHERE nom = 'Spoutnik';
id sexe date_naissance
nom
espece_id mere_id pere_id
32 M
2009-07-26 11:52:00 Spoutnik 3
52
NULL
Spoutnik est toujours là, mais il a désormais une mère ! Et son id n'a pas été modifié. Il s'agit donc bien d'une modification de la
ligne, et non d'une suppression suivie d'une insertion. De même, sa date de naissance est restée la même puisque l'UPDATE ne
portait que sur mere_id .
En fait, ce que nous avons fait était équivalent à la requête de modification suivante :
Code : SQL
UPDATE Animal
Partie 2 : Index, jointures et sous-requêtes
146/414
www.openclassrooms.com
REPLACE supprime l'ancienne ligne (ou les anciennes lignes), puis insère la nouvelle. Mais parfois, ce qu'on veut, c'est bien
modifier la ligne déjà existante. C'est possible grâce à la clause ON DUPLICATE KEY UPDATE de la commande INSERT.
Syntaxe
Voici donc la syntaxe de INSERT INTO avec cette fameuse clause :
Code : SQL
INSERT INTO nom_table [(colonne1, colonne2, colonne3)]
VALUES (valeur1, valeur2, valeur3)
ON DUPLICATE KEY UPDATE colonne2 = valeur2 [, colonne3 = valeur3];
Donc, si une contrainte d'unicité est violée par la requête d'insertion, la clause ON DUPLICATE KEY va aller modifier les
colonnes spécifiées dans la ligne déjà existante.
Exemple : revoici notre petit Spoutnik !
Code : SQL
SELECT id, sexe, date_naissance, nom, espece_id, mere_id, pere_id
FROM Animal
WHERE nom = 'Spoutnik';
id sexe date_naissance
nom
espece_id mere_id pere_id
32 M
2009-07-26 11:52:00 Spoutnik 3
NULL
NULL
Essayons d'insérer une autre tortue du nom de Spoutnik, mais cette fois-ci avec la nouvelle clause.
Code : SQL
INSERT INTO Animal (sexe, date_naissance, espece_id, nom, mere_id)
VALUES ('M', '2010-05-27 11:38:00', 3, 'Spoutnik', 52) -date_naissance et mere_id sont différents du Spoutnik existant
ON DUPLICATE KEY UPDATE mere_id = 52;
SELECT id, sexe, date_naissance, nom, espece_id, mere_id, pere_id
FROM Animal
WHERE nom = 'Spoutnik';
id sexe date_naissance
nom
espece_id mere_id pere_id
32 M
2009-07-26 11:52:00 Spoutnik 3
52
NULL
Spoutnik est toujours là, mais il a désormais une mère ! Et son id n'a pas été modifié. Il s'agit donc bien d'une modification de la
ligne, et non d'une suppression suivie d'une insertion. De même, sa date de naissance est restée la même puisque l'UPDATE ne
portait que sur mere_id .
En fait, ce que nous avons fait était équivalent à la requête de modification suivante :
Code : SQL
UPDATE Animal
Partie 2 : Index, jointures et sous-requêtes
146/414
www.openclassrooms.com
