Création d’objets et mises à jour

Module S2

Dalibo SCOP

24.09

29 août 2024

Sur ce document

Formation Module S2
Titre Création d’objets et mises à jour
Révision 24.09
PDF https://dali.bo/s2_pdf
EPUB https://dali.bo/s2_epub
HTML https://dali.bo/s2_html
Slides https://dali.bo/s2_slides
TP https://dali.bo/s2_tp
TP (solutions) https://dali.bo/s2_solutions

Licence Creative Commons CC-BY-NC-SA

Cette formation est sous licence CC-BY-NC-SA. Vous êtes libre de la redistribuer et/ou modifier aux conditions suivantes :

  • Paternité
  • Pas d’utilisation commerciale
  • Partage des conditions initiales à l’identique

Marques déposées

PostgreSQL® Postgres® et le logo Slonik sont des marques déposées par PostgreSQL Community Association of Canada.

Versions de PostgreSQL couvertes

Ce document ne couvre que les versions supportées de PostgreSQL au moment de sa rédaction, soit les versions 12 à 16.

Création d’objet et mises à jour

Introduction

  • DDL, gérer les objets
  • DML, écrire des données
  • Gérer les transactions
  • DDL (Data Definition Language)
  • DML (Data Manipulation Language)
  • TCL (Transaction Control Language)

Objectifs

  • Savoir créer, modifier et supprimer des objets
  • Savoir utiliser les contraintes d’intégrité
  • Savoir mettre à jour les données
  • Savoir utiliser les transactions

DDL

  • DDL
    • Data Definition Language
    • langage de définition de données
  • Permet de créer des objets dans la base de données

Objets d’une base de données

  • Objets définis par la norme SQL :
    • schémas
    • séquences
    • tables
    • contraintes
    • domaines
    • vues
    • fonctions
    • triggers

Créer des objets

  • Ordre CREATE
  • Syntaxe spécifique au type d’objet
  • Exemple :
CREATE SCHEMA s1;

Modifier des objets

  • Ordre ALTER
  • Syntaxe spécifique pour modifier la définition d’un objet, exemple:
  • Renommage
    ALTER type_objet ancien_nom RENAME TO nouveau_nom ;
  • changement de propriétaire
    ALTER type_objet nom_objet OWNER TO proprietaire ;
  • changement de schéma
    ALTER type_objet nom_objet SET SCHEMA nom_schema ;

Supprimer des objets

  • Ordre DROP
  • Exemples :
    • supprimer un objet :
    DROP type_objet nom_objet ;
    • supprimer un objet et ses dépendances :
    DROP type_objet nom_objet CASCADE ;

Schéma

  • Identique à un espace de nommage
  • Permet d’organiser les tables de façon logique
  • Possibilité d’avoir des objets de même nom dans des schémas différents
  • Pas d’imbrication (contrairement à des répertoires par exemple)
  • Schéma public
    • créé par défaut dans une base
    • souvent supprimé pour la sécurité

Gestion d’un schéma

  • CREATE SCHEMA nom_schéma
  • ALTER SCHEMA nom_schéma
    • renommage
    • changement de propriétaire
  • DROP SCHEMA [ IF EXISTS ] nom_schéma [ CASCADE ]

Accès aux objets

  • Nommage explicite
    • nom_schema.nom_objet
  • Chemin de recherche de schéma
    • paramètre search_path
    • SET search_path = schema1,schema2,public;
    • par défaut : $user, public

Séquences

  • Séquence
    • génère une séquence de nombres
  • Paramètres
    • valeur minimale MINVALUE
    • valeur maximale MAXVALUE
    • valeur de départ START
    • incrément INCREMENT
    • cache CACHE
    • cycle autorisé CYCLE

Création d’une séquence

CREATE SEQUENCE nom [ INCREMENT incrément ]
    [ MINVALUE valeurmin | NO MINVALUE ]
    [ MAXVALUE valeurmax | NO MAXVALUE ]
    [ START [ WITH ] début ]
    [ CACHE cache ]
    [ [ NO ] CYCLE ]
    [ OWNED BY { nom_table.nom_colonne | NONE } ]

Modification d’une séquence

ALTER SEQUENCE nom [ INCREMENT increment ]
    [ MINVALUE valeurmin | NO MINVALUE ]
    [ MAXVALUE valeurmax | NO MAXVALUE ]
    [ START [ WITH ] début ]
    [ RESTART [ [ WITH ] nouveau_début ] ]
    [ CACHE cache ] [ [ NO ] CYCLE ]
    [ OWNED BY { nom_table.nom_colonne | NONE } ]
  • Il est aussi possible de modifier
    • le propriétaire
    • le schéma

Suppression d’une séquence

DROP SEQUENCE nom [, ...]

Séquences, utilisation

  • Obtenir la valeur suivante
    • nextval('nom_sequence')
  • Obtenir la valeur courante
    • currval('nom_sequence')
    • mais nextval() doit être appelé avant dans la même session

Type SERIAL

  • Type serial/bigserial/smallserial
    • séquence générée automatiquement
    • valeur par défaut nextval(...)
  • Préférer un entier avec IDENTITY

Domaines

  • Permet d’associer
    • un type standard
    • et une contrainte (optionnelle)

Tables

  • Équivalent ensembliste d’une relation
  • Composé principalement de
    • colonnes ordonnées
    • contraintes

Création d’une table

  • Définition de son nom
  • Définition de ses colonnes
    • nom, type, contraintes éventuelles
  • Clauses de stockage
  • CREATE TABLE

CREATE TABLE

CREATE TABLE nom_table (
  definition_colonnes
  definition_contraintes
) clause_stockage;

Définition des colonnes

nom_colonne type [ COLLATE collation ] [ contrainte ]
[, ...]

Valeur par défaut

  • DEFAULT
    • affectation implicite
  • Utiliser directement par les types sériés

Copie de la définition d’une table

  • Création d’une table à partir d’une autre table
    • CREATE TABLE ... (LIKE table clause_inclusion)
  • Avec les valeurs par défaut des colonnes :
    • INCLUDING DEFAULTS
  • Avec ses autres contraintes :
    • INCLUDING CONSTRAINTS
  • Avec ses index :
    • INCLUDING INDEXES

Modification d’une table

  • ALTER TABLE
  • Définition de la table
    • renommage de la table
    • ajout/modification/suppression d’une colonne
    • déplacement dans un schéma différent
    • changement du propriétaire
  • Définition des colonnes
    • renommage d’une colonne
    • changement de type d’une colonne
  • Définition des contraintes
    • ajout/suppression d’une contrainte

Conséquences des modifications d’une table

  • contention avec les verrous
  • vérification des données
  • performance avec une possible réécriture de la table

Suppression d’une table

  • Supprimer une table :
    DROP TABLE nom_table;
  • Supprimer une table et tous les objets dépendants :
    DROP TABLE nom_table CASCADE;

Contraintes d’intégrité

  • ACID
    • Cohérence
    • une transaction amène la base d’un état stable à un autre
  • Assurent la cohérence des données
    • unicité des enregistrements
    • intégrité référentielle
    • vérification des valeurs
    • identité des enregistrements
    • règles sémantiques

Clé primaire d’une table

  • Identifie une ligne de manière unique
  • Une seule clé primaire par table
  • Une ou plusieurs colonnes
  • À choisir parmi les clés candidates
    • clé naturelle ou artificielle (technique, invisible)
    • les autres clés possibles peuvent être UNIQUE

Déclaration d’une clé primaire

Construction :

[CONSTRAINT nom_contrainte]
PRIMARY KEY ( nom_colonne [, ... ] )
  • Séquence
  • serial
  • GENERATED ALWAYS BY IDENTITY
  • UUID

Contrainte d’unicité

  • Garantit l’unicité des valeurs d’une ou plusieurs colonnes
  • Permet plusieurs valeurs NULL
    • en v15, possibilité de modifier ce comportement
  • Clause UNIQUE
  • Contrainte UNIQUE != index UNIQUE

Déclaration d’une contrainte d’unicité

Construction :

[ CONSTRAINT nom_contrainte]
{ UNIQUE { NULLS NOT DISTINCT } ( nom_colonne [, ... ] )

Intégrité référentielle

  • Contrainte d’intégrité référentielle
    • ou Clé étrangère
  • Référence une clé primaire ou un groupe de colonnes UNIQUE et NOT NULL
  • Garantie l’intégrité des données
  • FOREIGN KEY

Déclaration d’une clé étrangère

[ CONSTRAINT nom_contrainte ] FOREIGN KEY ( nom_colonne [, ...] )
    REFERENCES table_reference [ (colonne_reference [, ... ] ) ]
    [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
    [ ON DELETE action ] [ ON UPDATE action ] }

Vérification simple ou complète

  • Vérification complète ou partielle d’une clé étrangère
  • MATCH
    • MATCH FULL (complète)
    • MATCH SIMPLE (partielle)

Clé primaire et colonne identité

  • Identité d’un enregistrement
  • GENERATED … AS IDENTITY
    • ALWAYS
    • BY DEFAULT
  • Préférer à serial
  • Unicité non garantie sans contrainte explicite !

Mise à jour de la clé primaire

  • Que faire en cas de mise à jour d’une clé primaire ?
    • les clés étrangères seront fausses
  • ON UPDATE
  • ON DELETE
  • Définition d’une action au niveau de la clé étrangère
    • interdiction
    • propagation de la mise à jour
    • NULL
    • valeur par défaut

Vérifications

  • Présence d’une valeur
    • NOT NULL
  • Vérification de la valeur d’une colonne
    • CHECK

Vérifications différés

  • Vérifications après chaque ordre SQL
    • problèmes de cohérence
  • Différer les vérifications de contraintes
    • clause DEFERRABLE, NOT DEFERRABLE
    • INITIALLY DEFERED, INITIALLY IMMEDIATE

Vérifications plus complexes

  • Un trigger
    • si une contrainte porte sur plusieurs tables
    • si sa vérification nécessite une sous-requête
  • Préférer les contraintes déclaratives

Colonnes par défaut et générées

CREATE TABLE paquet (
  code       text          PRIMARY KEY,
  reception  timestamptz   DEFAULT now(),
  livraison  timestamptz   DEFAULT now() + interval '3d',
  largeur    int,    longueur int,   profondeur int,
  volume     int
      GENERATED ALWAYS AS ( largeur * longueur * profondeur )
      STORED    CHECK (volume > 0.0)
  ) ;
  • DEFAULT : expressions très simples, modifiables
  • GENERATED
    • fonctions « immutables », ne dépendant que de la ligne
    • difficilement modifiables
    • peuvent porter des contraintes

DML : mise à jour des données

  • SELECT peut lire les données d’une table ou plusieurs tables
    • mais ne peut pas les mettre à jour
  • Ajout de données dans une table
    • INSERT
  • Modification des données d’une table
    • UPDATE
  • Suppression des données d’une table
    • DELETE

Ajout de données : INSERT

  • Ajoute des lignes à partir des données de la requête
  • Ajoute des lignes à partir d’une requête SELECT
  • Syntaxe :
INSERT INTO nom_table [ ( nom_colonne [, ...] ) ]
    { liste_valeurs | requete }

INSERT avec liste d’expressions

INSERT INTO nom_table [ ( nom_colonne [, ...] ) ]
    VALUES ( { expression | DEFAULT } [, ...] ) [, ...]

INSERT à partir d’un SELECT

INSERT INTO nom_table [ ( nom_colonne [, ...] ) ]
    requête

INSERT et colonnes implicites

  • L’ordre physique peut changer dans le temps
    • résultats incohérents
    • requêtes en erreurs

Mise à jour de données : UPDATE

  • Ordre UPDATE
  • Met à jour une ou plusieurs colonnes d’une même ligne
    • à partir des valeurs de la requête
    • à partir des anciennes valeurs
    • à partir d’une requête SELECT
    • à partir de valeurs d’une autre table

Construction d’UPDATE

UPDATE nom_table
    SET
    {
     nom_colonne = { expression | DEFAULT }
    |
     ( nom_colonne [, ...] ) = ( { expression | DEFAULT } [, ...] )
    } [, ...]
    [ FROM liste_from ]
    [ WHERE condition | WHERE CURRENT OF nom_curseur ]

Suppression de données : DELETE

  • Supprime les lignes répondant au prédicat
  • Syntaxe :
DELETE FROM nom_table [ [ AS ] alias ]
    [ WHERE condition

Clause RETURNING

  • Spécifique à PostgreSQL
  • Permet de retourner les lignes complètes ou partielles résultants de INSERT, UPDATE ou DELETE
  • Syntaxe :
requete_sql RETURNING ( * | expression )

Transactions

  • ACID
    • Atomicité
    • un traitement se fait en entier ou pas du tout
  • TCL pour Transaction Control Language
    • valide une transaction
    • annule une transaction
    • points de sauvegarde

Auto-commit et transactions

  • Par défaut, PostgreSQL fonctionne en auto-commit
    • à moins d’ouvrir explicitement une transaction
  • Ouvrir une transaction
    • BEGIN TRANSACTION

Validation ou annulation d’une transaction

  • Valider une transaction
    • COMMIT
  • Annuler une transaction
    • ROLLBACK
  • Sans validation, une transaction est forcément annulée

Programmation

  • Certains langages implémentent des méthodes de gestion des transactions
    • PHP, Java, etc.
  • Utiliser ces méthodes prioritairement

Points de sauvegarde

  • Certains traitements dans une transaction peuvent être annulés
    • mais la transaction est atomique
  • Définir un point de sauvegarde
    • SAVEPOINT nom_savepoint
  • Valider le traitement depuis le dernier point de sauvegarde
    • RELEASE SAVEPOINT nom_savepoint
  • Annuler le traitement depuis le dernier point de sauvegarde
    • ROLLBACK TO SAVEPOINT nom_savepoint

Conclusion

  • SQL : toujours un traitement d’ensembles d’enregistrements
    • c’est le côté relationnel
  • Pour les définitions d’objets
    • CREATE, ALTER, DROP
  • Pour les données
    • INSERT, UPDATE, DELETE

Questions

N’hésitez pas, c’est le moment !

Travaux pratiques

Travaux pratiques (solutions)