Faq/Base/138/fr

From The Document Foundation Wiki
< Faq‎ | Base
Jump to: navigation, search

Comment mettre à jour une table à partir d'une autre ?

On souhaite mettre à jour les données d'une table avec les données d'une autre table, toutes deux disposant d'un champ commun.

  • La mise à jour d'une table se fait "traditionnellement" par une requête mettant en œuvre une commande UPDATE.
  • Le mode ébauche ne permet pas d'exécuter des requêtes de ce type : il ne permet d'exécuter que les requêtes qui sélectionnent des données.
  • Il faut passer par la commande Outils ▸ SQL pour exécuter une requête du type :


copie d'écran Outils Sql
Éxécution via Outils ▸ SQL

Dans cet exemple la table à mettre à jour est Table1,

  • son identifiant est IDTable1,
  • le champ à mettre à jour est ChampMaj.

La table contenant les mises à jour est MiseAJour,

  • son identifiant est IdMaJ (non utilisé dans cette requête),
  • le champ contenant la mise à jour est ChampMaj,
  • le champ clé externe, permettant le lien avec Table1 est IdTable1.

Ci-dessous le SQL :

UPDATE "Table1"
SET "ChampMaj" = (SELECT  "MiseAJour"."ChampMaj"  FROM "MiseAJour"
WHERE "Table1"."IDTable1"  = "MiseAJour"."IdTable1" )


Une "astuce" consiste à passer d'abord par la création d'une requête en mode ébauche pour sélectionner les tables et champs et définir éventuellement les jointures, puis de passer en mode SQL pour récupérer ce dernier et le copier. On peut ensuite lancer la commande Outils ▸ SQL et "finaliser" la requête en ajoutant notamment le "UPDATE". Cette technique permet d'éviter de taper les noms de champs et tables avec toutes les erreurs que cela suppose...


Nota

  1. Avant toute tentative de mise à jour des données il est conseillé de faire une copie de la base et de vérifier que cette dernière est fonctionnelle.
  2. La procédure décrite dans cette FAQ ne fonctionne que pour des tables ou des vues.
Le message d'erreur serait du type :
Table not found in statement [UPDATE "Table1" SET "ChampMaj" = (SELECT  "Requêteko"."ChampMaj"  FROM "Requêteko"]
Si les données de mise à jour viennent d'une requête il faut au préalable la transformer en vue (simple clic droit sur le nom de la requête puis Créer en tant que vue...).


Dans l'exemple ci-dessus la valeur du champ de la table MiseAJour vient remplacer celle contenue dans le champ de Table1. Un usage fréquent de mise à jour consiste à ajouter/supprimer la valeur (mouvement de stock par exemple). L'exemple suivant illustre comment ajouter le champ "mouvement" (qui peut comprendre des valeurs négatives) :

UPDATE "Table1"
SET "ChampMaj" = IFNULL("ChampMaj", 0) + (SELECT  "MiseAJour"."ChampMaj"  FROM "MiseAJour"
WHERE "Table1"."IDTable1"  = "MiseAJour"."IdTable1" )

Nota : On utilise la fonction IFNULL afin de gérer le cas où le champ de Table1 serait vide (cf. Comment gérer les champs vides (Null) ?