UPDATE
| |
---|---|
MySQL |
Syntaxe
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition] [ORDER BY ...] [LIMIT row_count] |
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name [, tbl_name ...] SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition] |
Paramètres
Nom | Description | |
---|---|---|
tbl_name | Ce paramètre permet d'indiquer le nom de la table à traiter | |
col_name1, col_name2 | Ce paramètre permet d'indiquer le nom du champ dans la table à traiter | |
expr1, expr2 | Ce paramètre permet d'indiquer une expression contenant une valeur à mettre dans le champ de la table à traiter | |
where_definition | Ce paramètre permet d'indiquer une suite de condition de recherche dans la table de base de données |
Description
Cette instruction permet de mettre à jour des champs d'enregistrements dans une table. Ainsi, grâce à cette instruction vous pouvez changer aussi bien ou un plusieurs enregistrements, et de plus, vous pouvez changer seulement un champ ou des champs de la table.
Remarques
- ATTENTION ! Si vous écrivez une requête prenant 6 heures a exécuté et que vous tentez du tuer le processus au bout de 4 heures, il pourrait prendre jusqu'à 12 heures pour complètement arrêter le processus à cause du fait qu'il doit défaire toutes les modifications qu'il a effectué et la ramener comme avant le lancement de la requête.
- Si vous faites une mise à jour sur une table avec plusieurs millions d'enregistrements de la manière suivante :
- Si vous utilisez fréquemment des requêtes UPDATE dans une table, il est préférable de changer le type de base de données pour InnoDB, tandis que si vous utilisez seulement une fois par année des UPDATE sur une table, voir même peut-être jamais, il est préférable de le changer pour MyISAM. La raison c'est que la table au complet est verrouillé quand on fait des changements avec le type MyISAM, tandis que InnoBD ne verrouille que le ou les enregistrements concerné dans la table.
- Piège des «SET» : Lorsque que vous indiquez des champs à modifier, il est très important d'éviter de mettre des opérateurs «AND» et «OR» directement dans l'affectation du champ, et de bien isoler vos opérateurs par des parenthèses afin de ne pas qu'il y est de confusion. Ainsi, si vous écrivez :
- SET empty : Vous devez obligatoirement avoir au moins un champ d'indiquer dans la définition «SET», et surtout ne pas avoir «UPDATE matable SET WHERE condition», car sinon vous risquez d'avoir un message :
- Traitement ligne de par ligne : Les requêtes SQL de MySQL ne sont pas traités comme un ensemble mais ligne par ligne. Ainsi, il n'est pas possible d'incrémenter tous les valeurs de clef primaire d'une table à cause de cette raison. Ainsi, l'exemple suivant :
UPDATE matable SET WHERE monchamp = CONCAT('/' ,champ) AND subid = 10046;
Il serait plutôt préférable de faire un UPDATE imbriqué ou la création d'un INDEX (CREATE INDEX) car le CONCAT ralentira fort probablement la requête.
UPDATE matable SET field1=1 AND field2=2
Il comprendra l'expression suivante (lequel affectera uniquement le premier champ mais pas le deuxième) :
UPDATE matable SET field1=(1 AND field2=2)
plutôt que ceci :
UPDATE matable SET field1=1, field2=2
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near |
et le numéro d'erreur #1064 avec certains ajustements de MySQL.
CREATE TABLE TableExemple (Clef INT UNIQUE);
INSERT INTO TableExemple VALUES (1), (2), (3);
UPDATE TableExemple SET Clef = Clef + 1;
Provoquera un message d'erreur :
Duplicate entry '2' for key 'Clef' |
Si vous avez ce genre de problème, vous devriez passer à une base de données plus solide comme DB2, SQL Server, Sybase, PostgreSQL,...
Exemples
Pour le problème suivant, sachant que nous avons une table «cdmuser» ressemblant à ceci :
Cin | UserId | FirstName | LastName | Password | DefLang | DefEmail | Status | NumVisit | CreateDate | CreateUserId | LastUpdate | UpdateUserId |
---|---|---|---|---|---|---|---|---|---|---|---|---|
000 | SYSADM | Sylvain | Maltais | PASSWORD | FR | support@gladir.com | A | 615 | 2006/03/09 | SYSADM | 2006/03/09 | SYSADM |
000 | STREMBLAY | Steve | Tremblay | PASSWORD | FR | stremblay@mail.com | A | 615 | 2006/03/09 | SYSADM | 2006/03/09 | SYSADM |
Voici un exemple effectuant un vulgaire remplacement du contenu d'un champ par une autre valeur :
Et les informations deviendront comme ceci :
Cin | UserId | FirstName | LastName | Password | DefLang | DefEmail | Status | NumVisit | CreateDate | CreateUserId | LastUpdate | UpdateUserId |
---|---|---|---|---|---|---|---|---|---|---|---|---|
000 | SYSADM | Sylvain | Maltais | PASSWORD | FR | support@gladir.ca | A | 615 | 2006/03/09 | SYSADM | 2006/03/09 | SYSADM |
000 | STREMBLAY | Steve | Tremblay | PASSWORD | FR | stremblay@mail.com | A | 615 | 2006/03/09 | SYSADM | 2006/03/09 | SYSADM |
Sachant que la table «contact» a le contenu suivant :
id | prenom | nom | courriel |
---|---|---|---|
1 | Sylvain | Maltais | sylvain.maltais@moncourriel.com |
2 | Gabriel | Maltais | gabriel.maltais@nomdomaine.com |
3 | Thomas | Gagnon | thomas.gagnon@autrenomdedomaine.com |
4 | Yvan | Jean | yvan.jean@ceciestunnomdedomaine.com |
L'exemple suivant permet de remplacer toutes les noms de domaines des adresses de courriels de la table «contact» par un nom de domaine «mailinator.com» (ainsi les adresses de courriels de production sont redirigés vers une boite de courriel de test) :
on obtiendra le résultat suivant :
id | prenom | nom | courriel |
---|---|---|---|
1 | Sylvain | Maltais | sylvain.maltais@mailinator.com |
2 | Gabriel | Maltais | gabriel.maltais@mailinator.com |
3 | Thomas | Gagnon | thomas.gagnon@mailinator.com |
4 | Yvan | Jean | yvan.jean@mailinator.com |
L'exemple suivant permet de remplacer les noms de domaines du champ des courriels (email) dans la table users sachant que les courriels ne contient pas toujours de noms de domaines et ayant des courriels en double et rajoute des éléments aléatoires pour qu'il soit unique :
Voir également
Article - Les géants de l'informatique - Oracle
Références
MySQL - Référence, Edition Micro Application, Nicolas Rivereau, Antoine Pichot, 2002, ISBN: 2-7429-2560-0, page 919.
MySQL: The definitive guide to using, programming, and administering MySQL 4 databases - Second Edition, Paul Dubois, 2003, ISBN: 0-7357-1212-3, page 935