UPDATE

Nom

UPDATE -- met à jour les lignes d'une table

Synopsis

UPDATE [ ONLY ] table SET colonne = { expression | DEFAULT } [, ...]
    [ FROM liste_from ]
    [ WHERE condition ]

Description

UPDATE modifie les valeurs des colonnes spécifiées pour toutes les lignes qui satisfont la condition. Seules les colonnes à modifier doivent être mentionnées dans la clause SET ; Les autres colonnes conservent leur précédente valeur.

Par défaut, UPDATE met à jour les lignes de la table spécifiée et toutes ses sous-tables. Si vous souhaitez ne mettre à jour que la table spécifique mentionnée, vous pouvez utiliser la clause ONLY.

Il existe deux façons de modifier une table en utilisant les informations contenues dans d'autres tables de la base de données : en utilisant des sous-requêtes ou en spécifiant des tables supplémentaires dans la clause FROM. La technique la plus appropriée dépend des circonstances spécifiques.

Vous devez avoir le droit UPDATE sur la table pour la mettre à jour, ainsi que le droit SELECT sur toutes les tables dont les valeurs sont lues dans expression ou condition.

Paramètres

table

Le nom de la table à mettre à jour (pouvant être qualifié du nom du schéma).

colonne

Le nom d'une colonne dans table. Le nom de la colonne peut être qualifié avec un nom de sous-champ ou un indice de tableau si nécessaire.

expression

Une expression à affecter à la colonne. L'expression peut utiliser les anciennes valeurs de cette colonne ou d'autres colonnes de la table.

DEFAULT

Initialise sa colonne à la valeur par défaut (qui vaut NULL si aucune expression spécifique par défaut ne lui a été affectée).

liste_from

Une liste d'expressions de tables, permettant aux colonnes des autres tables d'apparaître dans la condition WHERE et les expressions de mise à jour. Ceci est similaire à la liste de tables pouvant être spécifiée dans Clause FROM d'une instruction SELECT. Notez que la table cible ne doit pas apparaître dans liste_from, sauf si vous comptez faire une auto-jointure (auquel cas elle doit apparaître avec un alias dans liste_from).

condition

Une expression qui renvoie une valeur de type boolean. Seules les lignes pour lesquelles cette expression renvoie true sont mises à jour.

Sorties

En cas de succès, une commande UPDATE renvoie un message de la forme

UPDATE total

Le total est le nombre de lignes mises à jour. Si total vaut 0, aucune ligne ne correspond à condition (ceci n'est pas considéré comme une erreur).

Notes

Quand une clause FROM est présente, la table cible est jointe aux tables mentionnées dans liste_from, et chaque ligne en sortie de la jointure représente une opération de mise à jour pour la table cible. Lors de l'utilisation de FROM, vous devriez vous assurer que la jointure produit au moins une ligne en sortie pour chaque ligne à modifier. En d'autres termes, une ligne cible ne doit pas être jointe plus d'une fois à une ligne d'une autre table. Si c'est le cas, alors seulement une des lignes de jointures est utilisée pour mettre à jour la ligne cible mais celle qui est utilisée n'est pas prévisible.

À cause de ce manque de déterminisme, il est plus sûr de ne référencer d'autres tables qu'à l'intérieur de sous-requêtes, même si c'est plus difficile à lire et plus lent que l'utilisation d'une jointure.

Exemples

Modifie le mot Drame en Dramatique dans la colonne genre de la table films :

UPDATE films SET genre = 'Dramatique' WHERE genre = 'Drame';

Ajuste les entrées de température et réinitialise la précipitation à sa valeur par défaut dans une ligne de la table temps :

UPDATE temps SET temp_basse = temp_basse+1, temp_haute = temp_basse+15, prcp =
DEFAULT
  WHERE ville = 'San Francisco' AND date = '2003-07-03';

Incrémente le total des ventes de la personne qui gère le compte d'Acme Corporation, en utilisant la syntaxe de la clause du FROM :

UPDATE employes SET total_ventes = total_ventes + 1 FROM comptes
  WHERE compte.nom = 'Acme Corporation'
  AND employes.id = compte.vendeur;

Réalise la même opération en utilisant une sous-requête dans la clause WHERE :

UPDATE employes SET total_ventes = total_ventes + 1 WHERE id =
  (SELECT vendeur FROM comptes WHERE nom = 'Acme Corporation');

Tente d'insérer un nouvel élément dans le stock avec la quantité. Si l'élément existe déjà, à la place, met à jour le total du stock de l'élément existant. Pour faire cela sans échec dans la transaction entière, utilise les points de sauvegarde.

BEGIN;
-- autres opérations
SAVEPOINT sp1;
INSERT INTO vins VALUES('Chateau Lafite 2003', '24');
-- Suppose que l'instruction ci-dessus échoue à cause d'une violation de clé
-- unique, donc nous lançons maintenant ces commandes:
ROLLBACK TO sp1;
UPDATE vins SET stock = stock + 24 WHERE nomvin = 'Chateau Lafite 2003';
-- continue avec les autres opérations, et enfin
COMMIT;
 

Compatibilité

Cette commande est conforme au standard SQL, à l'exception de la clause FROM qui est une extension PostgreSQL.

D'autres systèmes de bases de données offrent une option FROM dans laquelle la table cible est supposée être de nouveau indiquée dans le FROM. Ce n'est pas ainsi que PostgreSQL interprète FROM. Faites attention pour le portage d'applications utilisant cette extension.