Faq/Base/139/fr

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

Comment ajouter des données à une table à partir d'une autre table (requête) ?

On souhaite ajouter les données d'une table ou d'une requête à une autre table.

Utilisation de l'assistant

Dans LibreOffice il suffit de déplacer légèrement à la souris la table "source" pour ouvrir un assistant qui permet la fonctionnalité (nota : copier/coller la table déclenche également l'assistant).

Le dialogue affiche en nom de table celui de la table "copiée" (ou déplacée à la souris). Remplacer ce nom par celui de la table "cible" (si elle existe, sinon l'assistant permet de créer la nouvelle structure et d'y coller les données).

Si la table "cible" existe, choisir en-dessous Ajouter des données.

Par exemple, si on veut ajouter les données de Table1 dans Table2 on déplace Table1, l'assistant se déclenche, indiquer la cible (Table2) et choisir Ajouter des données.

copie d'écran assistant copie
Ajouter Table1 à Table2

Cliquer Suivant> permet ensuite d'apparier les colonnes. Cette partie est très performante puisqu'elle permet l'ajout entre structures différentes (noms et nombres de champ).

copie d'écran assistant copie
Ajouter Table1 à Table2


Nota : les tables ont souvent un champ clé primaire défini en auto-valeur ; il va de soi qu'il ne faut pas sélectionner ce champ dans la table "cible"...

Utilisation du SQL

  • L'ajout dans une table se fait "traditionnellement" par une requête mettant en œuvre une commande INSERT INTO.
  • 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 dans laquelle on veut ajouter est Table2,

  • son identifiant est ID ; défini en auto-valeur il n'est pas utilisé dans cette requête.
  • les champs à mettre à jour sont Libellé et Montant.

La table contenant les données est Table1,

  • son identifiant est ID (non utilisé dans cette requête),
  • les champs à ajouter à Table2 sont Libellé et Montant.

Ci-dessous le SQL :

INSERT INTO "Table2" ("Libellé", "Montant") SELECT "Libellé", "Montant" FROM "Table1"


Une "astuce" consiste à passer d'abord par la création d'une requête en mode ébauche pour sélectionner les tables et champs 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 "INSERT INTO". 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 :
1: Table not found in statement [INSERT INTO "Table2" ("Libellé", "Montant") SELECT "Libellé", "Montant" FROM "Requête1"]
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...). Utiliser ensuite le même type d'instructions SQL qu'avec une table.
  • Télécharger une base exemple
    • La base comprend deux requêtes avec les syntaxes SQL permettant d'ajouter à Table2 depuis une table ou une vue.
    • Ces requêtes ne peuvent pas être lancées, elle ne sont là que comme exemple qu'on peut éditer en SQL pour copier la ligne et la coller dans Outils ▸ SQL.