Bien sûr, toutes les possibilités de conditions que l'on a vues pour la sélection sont encore valables pour les modifications.
Après tout, une clause WHERE est une clause WHERE !
Pour l'élément à modifier
Ce matin, un client demande à voir vos chats Bleu Russe, car il compte en offrir un à sa fille. Ni une ni deux, vous vérifiez dans la
base de données, puis allez chercher Schtroumpfette, Filou, Caribou, Raccou, Callune, Feta et Cawette.
Et là, horreur et damnation ! À l'instant où ses yeux se posent sur Cawette, le client devient vert de rage. Il prend à peine le temps
de vous expliquer, outré, que Cawette n'est pas un Bleu Russe mais bien un Nebelung, à cause de ses poils longs, puis s'en va
chercher un éleveur plus compétent.
Bon… L'erreur est humaine, mais autant la réparer rapidement. Vous insérez donc une nouvelle race dans la table ad hoc.
Code : SQL
INSERT INTO Race (nom, espece_id, description)
VALUES ('Nebelung', 2, 'Chat bleu russe, mais avec des poils
longs...');
Une fois cela fait, il vous reste encore à modifier la race de Cawette. Pour cela, vous avez besoin de l'id de la race Nebelung que
vous venez d'ajouter.
Vous vous en doutez, il est tout à fait possible de le faire grâce à une sous-requête :
Code : SQL
UPDATE Animal SET race_id =
(SELECT id FROM Race WHERE nom = 'Nebelung' AND espece_id = 2)
WHERE nom = 'Cawette';
Il est bien entendu indispensable que le résultat de la sous-requête soit une valeur !
Limitation des sous-requêtes dans un UPDATE
Une limitation importante des sous-requêtes est qu'on ne peut pas modifier un élément d'une table que l'on utilise dans une
sous-requête.
Exemple : vous trouvez que Callune ressemble quand même fichtrement à Cawette, et ses poils sont aussi longs. Du coup, vous
vous dites que vous auriez dû également modifier la race de Callune. Vous essayez donc la requête suivante :
Code : SQL
UPDATE Animal SET race_id =
(SELECT race_id FROM Animal WHERE nom = 'Cawette' AND espece_id
= 2)
WHERE nom = 'Callune';
Malheureusement :
Code : Console
ERROR 1093 (HY000): You can't specify target table 'Animal' for update in FROM clause
La sous-requête utilise la table Animal, or vous cherchez à modifier le contenu de celle-ci. C'est impossible !
Partie 2 : Index, jointures et sous-requêtes
126/414
www.openclassrooms.com
Après tout, une clause WHERE est une clause WHERE !
Pour l'élément à modifier
Ce matin, un client demande à voir vos chats Bleu Russe, car il compte en offrir un à sa fille. Ni une ni deux, vous vérifiez dans la
base de données, puis allez chercher Schtroumpfette, Filou, Caribou, Raccou, Callune, Feta et Cawette.
Et là, horreur et damnation ! À l'instant où ses yeux se posent sur Cawette, le client devient vert de rage. Il prend à peine le temps
de vous expliquer, outré, que Cawette n'est pas un Bleu Russe mais bien un Nebelung, à cause de ses poils longs, puis s'en va
chercher un éleveur plus compétent.
Bon… L'erreur est humaine, mais autant la réparer rapidement. Vous insérez donc une nouvelle race dans la table ad hoc.
Code : SQL
INSERT INTO Race (nom, espece_id, description)
VALUES ('Nebelung', 2, 'Chat bleu russe, mais avec des poils
longs...');
Une fois cela fait, il vous reste encore à modifier la race de Cawette. Pour cela, vous avez besoin de l'id de la race Nebelung que
vous venez d'ajouter.
Vous vous en doutez, il est tout à fait possible de le faire grâce à une sous-requête :
Code : SQL
UPDATE Animal SET race_id =
(SELECT id FROM Race WHERE nom = 'Nebelung' AND espece_id = 2)
WHERE nom = 'Cawette';
Il est bien entendu indispensable que le résultat de la sous-requête soit une valeur !
Limitation des sous-requêtes dans un UPDATE
Une limitation importante des sous-requêtes est qu'on ne peut pas modifier un élément d'une table que l'on utilise dans une
sous-requête.
Exemple : vous trouvez que Callune ressemble quand même fichtrement à Cawette, et ses poils sont aussi longs. Du coup, vous
vous dites que vous auriez dû également modifier la race de Callune. Vous essayez donc la requête suivante :
Code : SQL
UPDATE Animal SET race_id =
(SELECT race_id FROM Animal WHERE nom = 'Cawette' AND espece_id
= 2)
WHERE nom = 'Callune';
Malheureusement :
Code : Console
ERROR 1093 (HY000): You can't specify target table 'Animal' for update in FROM clause
La sous-requête utilise la table Animal, or vous cherchez à modifier le contenu de celle-ci. C'est impossible !
Partie 2 : Index, jointures et sous-requêtes
126/414
www.openclassrooms.com
