• 20 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 29/10/2019

Ajoutez des données

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Vous avez vu un petit aperçu d'une requête SQL d'ajout de données dans le chapitre précédent. Je vais ici vous la détailler et vous apporter quelques compléments.

La documentation de PostgreSQL concernant les requêtes de type INSERT est disponible ici : http://docs.postgresql.fr/9.6/sql-insert.html

Dans ce chapitre, je vais m'appuyer sur mon exemple de gestion de tickets dont voici, pour rappel, le MPD :

MPD Gestion de tickets
MPD Gestion de tickets

Ajouter des valeurs explicites

INSERT INTO public.utilisateur   -- INSERT INTO <schéma>.<table>
(  
    id, nom, prenom         -- <colonnes dont vous allez donner les valeurs>
)
VALUES
(
    4, 'Dalton', 'Joe'      -- <valeurs des colonnes listées (dans le même ordre)>
);

Il est possible d'ajouter plusieurs lignes dans une même requête, en séparant les ensembles de valeurs par une virgule :

INSERT INTO public.utilisateur
    (id, nom, prenom)
VALUES
    (4, 'Dalton', 'Joe'),      -- ligne 1
    (5, 'Dalton', 'William'),  -- ligne 2
    (6, 'Dalton', 'Jack'),     -- ligne 3
    (7, 'Dalton', 'Averell')   -- ligne 4
;

Les valeurs par défaut

Les colonnes non listées dans votre requête d'INSERT prendront :

  • leur valeur par défaut telle que précisée dans la requête de création de la table

  • si aucune valeur par défaut n'a été précisée, elles prendront la valeur NULL. Si la colonne n'accepte pas les NULL, une erreur sera relevée et aucune ligne ne sera ajoutée à la table.

Prenons la table tache suivante :

CREATE TABLE tache (
    id INTEGER NOT NULL DEFAULT nextval('tache_id_seq'),
    libelle VARCHAR(100) NOT NULL,
    priorite INTEGER NOT NULL DEFAULT 1,
    realisateur_id INTEGER,
    CONSTRAINT tache_pk PRIMARY KEY (id)
);
INSERT INTO tache
    (libelle)
VALUES
    ('Corriger le bug n°6');

Si la valeur de la séquence était 14, la requête précédente va ajouter la ligne :

id

libelle

priorite

realisateur_id

15

Corriger le bug n°6

1

NULL

Pour récupérer la valeur de la séquence qui a été utilisée lors de l'ajout de la ligne :

SELECT currval('tache_id_seq');
-- Renvoie : 15

Les clés étrangères

Lorsqu'une colonne est clé étrangère, l'ajout de ligne se fait comme pour les autres colonnes. Cependant, vous devez vous assurer que la valeur que vous donnez existe bien dans la table de référence.

Avec la table utilisateur suivante :

id

nom

prenom

4

Dalton

Joe

5

Dalton

William

6

Dalton

Jack

7

Dalton

Averell

Vous pourrez utiliser les valeurs 4, 5, 6 et 7 dans la colonne responsable_id de la table projet mais aucune autre valeur.

Ajouter le résultat d'une requête de sélection

Dans une requête d'INSERT, il est aussi possible d'utiliser une requête SELECT comme source au lieu de fournir explicitement des valeurs.

Imaginez que vous vouliez copier un projet par exemple, vous pouvez le faire facilement ainsi :

INSERT INTO projet (
    nom, date_creation, cloture, responsable_id
)
SELECT
    nom, date_creation, cloture, responsable_id
FROM projet
WHERE id = 18;

Vous pouvez aussi fixer certaines valeurs en les intégrant à votre requête de sélection. Voici, par exemple, comment imposer la valeur de la colonne cloture:

INSERT INTO projet (
    nom, date_creation, cloture, responsable_id
)
SELECT
    nom, date_creation, FALSE, responsable_id
FROM projet
WHERE id = 18;

Vous pouvez aussi utiliser des fonctions et des opérateurs dans la requête de SELECT. Cette souplesse permet de construire des requêtes INSERT parfaitement adaptées à votre besoin :

INSERT INTO projet (
    nom,
    date_creation, cloture, responsable_id
)
SELECT
    projet.nom || ' Perso ' || utilisateur.prenom,
    CURRENT_TIMESTAMP, FALSE, projet.responsable_id
FROM
    projet
    JOIN utilisateur ON utilisateur.id = projet.responsable_id
WHERE projet.id IN (18, 42);

Ici, je copie les projets 18 et 42 :

  • en ajoutant « Perso » et le nom du responsable après le nom du projet ;

  • en mettant la date et l'heure actuelle dans la colonnedate_creation;

  • en fixant la valeur de la colonne cloture à FALSE.

Ce qui va donner la table projet suivante :

id

nom

date_creation

cloture

responsable_id

18

Projet X

2016-31-12 08:30:00.000

TRUE

4

20

Projet Y

2017-01-06 16:30:00.000

TRUE

2

42

Projet Z

2016-02-21 14:45:00.000

FALSE

6

...

 

 

 

 

61

Projet X Perso Joe

2017-03-31 16:15:00.000

FALSE

4

62

Projet Z Perso Jack

2017-03-31 16:15:00.000

FALSE

6

Exemple de certificat de réussite
Exemple de certificat de réussite