Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Les 22 & 23 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. PostgreSQL
  3. Définition des données
Extrait - PostgreSQL Administration et exploitation de vos bases de données (4e édition)
Extraits du livre
PostgreSQL Administration et exploitation de vos bases de données (4e édition) Revenir à la page d'achat du livre

Définition des données

Introduction

Le langage de définition des données s’appuie sur trois ordres : CREATE, ALTER et DROP déclinés pour chaque objet de la base de données. Chaque objet peut correspondre soit à un objet physique, donc à des fichiers dans les systèmes de fichiers, soit à un objet logique, et donc seulement une définition stockée dans le catalogue de la base de données.

L’exécution de ces ordres implique nécessairement un verrouillage exclusif des objets concernés. Ce verrouillage étant exclusif, aucun autre verrou en lecture ou en écriture ne peut être maintenu. Ceci ne pose pas de problème lors de la création d’un objet puisqu’aucune session concurrente ne peut l’avoir réclamé mais lors de la suppression d’un objet, il faut attendre que tous les verrous existants soient relâchés. En ce qui concerne une base de données par exemple, il ne doit pas y avoir de sessions connectées à cette base.

L’impact le plus important concerne la modification d’un objet, car le verrou est conservé durant tout le temps d’exécution de la commande, et ceci peut donc avoir un impact sur l’exécution de requêtes concurrentes.

Les ordres de définition des données doivent donc être exécutés avec précaution...

Les espaces de tables

Un espace de tables est un répertoire d’un système de fichiers, dans lequel PostgreSQL écrit les fichiers des tables et des index. Par défaut, PostgreSQL dispose d’un espace de tables situé dans le répertoire du groupe de bases de données. Il est possible de créer d’autres espaces de tables, permettant ainsi à l’administrateur de choisir l’emplacement du stockage d’une table ou d’un index.

Plusieurs motifs peuvent amener un administrateur à créer un espace de tables :

  • La partition ne dispose plus de suffisamment d’espace libre. Les espaces de tables permettent dans ce cas d’utiliser plusieurs disques durs différents pour un même groupe de base de données, sans utiliser de systèmes de volumes logiques, comme LVM dans les systèmes GNU/Linux.

  • L’utilisation des tables et des index provoque une saturation des écritures et des lectures du sous-système disque où est situé l’espace de tables par défaut. Même sur des systèmes performants, la montée en charge d’une application peut amener l’administrateur à créer d’autres espaces de tables, sur des sous-systèmes disques différents. Ainsi, les écritures et les lectures de fichiers de tables et d’index sont réparties...

Les bases de données

Dans une instance de PostgreSQL, une base de données est un conteneur. Elle contient des schémas, des tables, des index et tous les objets utiles à une application. Elle accueille aussi les connexions depuis les applications clientes. En effet, lorsqu’une connexion est ouverte sur une base de données particulière, il n’est pas possible d’utiliser directement des objets créés dans d’autres bases de données.

Il est donc important de répartir correctement les objets et données des applications dans les bases de données, notamment en utilisant la notion de schéma. La création d’une base de données peut s’effectuer avec l’ordre CREATE DATABASE ou avec la commande du système d’exploitation createdb.

Quelques paramètres permettent de personnaliser la création d’une base de données :

  • Pour créer une base de données, il est nécessaire d’être superutilisateur ou d’avoir le privilège CREATEDB. En revanche, il est possible de transmettre l’appartenance à un utilisateur non privilégié, avec l’option OWNER. L’option de la commande createdb est -O ou --owner.

  • La base de données template1 sert de modèle par défaut pour la création d’une autre base de données. Pour chaque base créée avec ce modèle, une copie de template1 est faite, pour que tous les objets créés dans template1 sont dupliqués dans la nouvelle base. La base template0 fonctionne de la même façon mais il n’est pas possible de créer des objets dans cette base-modèle : template0 reste une base vierge. Il est possible de choisir la base de données servant de modèle avec l’option TEMPLATE. Il est bien sûr possible de choisir n’importe quelle base de données modèle existante. L’option de la commande createdb est -T ou --template.

  • Un paramètre important...

Les schémas

Les schémas, aussi appelés espaces de noms, existent implicitement dans toutes les bases de données. Il s’agit d’une notion purement logique qui permet de regrouper par nom les objets comme les tables, les vues, les fonctions, définissant ainsi un chemin d’accès.

De cette façon, dans une même base de données, plusieurs objets peuvent avoir le même nom mais être distincts physiquement. Le nom du schéma préfixant le nom de l’objet, la distinction entre les objets est claire.

L’analogie peut être faite avec la notion de package ou de namespace dans différents langages de programmation. Des objets avec des noms identiques (attributs, méthodes...), mais avec une implémentation différente peuvent être distingués par le nom du package. Dans PostgreSQL, la notion est identique, en considérant le fait qu’une classe corresponde à une table et l’implémentation aux données. Le package correspond donc à un schéma. Malgré cette analogie, il est à noter une différence importante : il n’existe qu’un seul niveau de profondeur avec les schémas. Dans PostgreSQL, il n’est pas possible de créer des schémas dans un schéma.

Plusieurs schémas existent initialement dans une base de données...

Les tables

Une table est l’élément de base d’un serveur de bases de données. C’est dans une table que les données sont stockées et c’est l’organisation des tables qui détermine la qualité de la base de données.

Le choix des types de données et les liens entre les tables font partie de l’étape de conception de la base de données pour qu’elle soit performante et pérenne.

L’ordre CREATE TABLE permet de mettre en œuvre les choix de cette conception. 

Le synopsis minimal de cette commande est le suivant :


CREATE [ TEMP | UNLOGGED ] TABLE [ IF NOT EXISTS ] nomtable ( [ 
  { nomcol type [ COLLATE collation ] [ contraintecolonne [...] ] 
    | contraintetable  
    | LIKE source_table [ like_option ... ]  
  } [,...] ] )  
[ INHERITS ( parent_table [, ... ] ) ]  
[ WITH ( storage_parameter [= value] [, ... ] )  
  | WITH OIDS | WITHOUT OIDS ]  
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]  
[ TABLESPACE tablespace_name ] 
 

Préalablement à la définition des attributs d’une table, un certain nombre de caractéristiques annexes peuvent être précisées afin de modifier le comportement d’une table dans la base de données.

En premier lieu, les modificateurs TEMP et UNLOGGED permettent de modifier la nature d’une table :

  • Une table temporaire créée avec le modificateur TEMP n’est visible que dans le contexte de la session courante, c’est-à-dire qu’aucune autre session concurrente n’a accès à cette table et que la table n’existe plus dès que la session se termine. La clause ON COMMIT modifie la visibilité de la table temporaire à l’échelle de la transaction. Par défaut, les lignes sont préservées jusqu’à la fin de la session (PRESERVE ROWS), mais il est possible de les supprimer (DELETE ROWS) ou de supprimer la table temporaire à la fin de la transaction (DROP). Les index associés à cette table sont aussi temporaires, et donc supprimés au même moment que la table. Une table temporaire peut avoir le même nom qu’une table permanente, et dans ce cas, elle sera la seule visible...

Les vues

Une vue est l’équivalent d’une requête SELECT mais stockée sous la forme d’une relation équivalente à une table mais en lecture seule. Les données affichées par une vue ne sont pas modifiables et la requête SELECT sous-jacente est lancée à chaque appel de la vue. L’intérêt d’une vue est de présenter les données d’une certaine façon et d’être toujours disponible.

L’ordre CREATE VIEW permet de créer une vue, en se basant sur une requête SELECT, comme dans le synopsis suivant :


CREATE [ OR REPLACE ] [ TEMP ] VIEW nom [ ( colonne, ... ) ]  
  WITH ( nomoption = valeur] [, ... ] ) 
  AS requete  
  WITH [ CASCADED | LOCAL ] CHECK OPTION ; 
 

Par défaut, le nom des colonnes de la vue correspond au nom des colonnes retourné par la requête SELECT. Il est possible de modifier ces noms de colonnes en les précisant entre parenthèses, après le nom de la table.

De plus, il est possible de remplacer une vue existante, en ajoutant les mots-clés OR REPLACE après CREATE, à condition que les colonnes de la vue soient identiques en nombre et en type.

La clause TEMP modifie la portée de la vue en la rendant accessible uniquement dans la session en cours et seulement pendant le temps de la session. La vue est donc supprimée à la fin de la session. Lorsqu’une vue temporaire a le même nom qu’un objet existant, elle est prioritaire sur cet objet pendant la session.

Il est possible de mettre à jour les données présentées par une vue dans certaines conditions précises. La clause WITH CHECK OPTION permet de vérifier que les modifications apportées aux données correspondent aux clauses de la vue, c’est-à-dire que la donnée modifiée fera partie de la vue. Les modificateurs LOCAL et CASCADED permettent...

Le système de règles

Il existe dans PostgreSQL un système de réécriture de requêtes, appelé règles de réécriture, qui permet de modifier en profondeur l’interprétation des ordres SQL. Le comportement est assez proche de celui des déclencheurs, mais alors qu’un déclencheur permet des actions avant ou après une requête, une règle permet de détourner une action afin d’en effectuer une autre à la place.

Le synopsis de l’ordre de création d’une règle est le suivant :


CREATE [ OR REPLACE ] RULE nom AS ON evenement  
    TO table [ WHERE condition ]  
    DO [ ALSO | INSTEAD ] { NOTHING | commande |  
( commande ; commande ... ) } 
 

Les mots-clés OR REPLACE permettent de remplacer une règle existante donc avec le même nom.

L’événement doit être un des quatre ordres de manipulation des données (SELECT, UPDATE, INSERT et DELETE).

La condition permet de filtrer la réécriture, en fonction des valeurs de la ligne sélectionnée, avec le mot-clé OLD désignant la ligne.

Le mot-clé ALSO précise que la requête qui déclenche la réécriture est effectuée, alors que le mot-clé INSTEAD indique que cette requête ne sera pas exécutée....

L’héritage

PostgreSQL propose un système d’héritage aux tables, ce qui permet à une table fille d’hériter des colonnes de la table mère, et d’avoir ses propres colonnes en plus. Lorsqu’un tuple est inséré dans la table fille, les données sont aussi visibles depuis la table mère. Seules les colonnes propres à la table fille sont stockées physiquement dans cette table.

Par exemple, la table prestations de la base de données clients permet de stocker des informations génériques sur des prestations. En créant une table formations, héritant de la table prestations, il est possible de spécialiser cette table, en ajoutant des champs, comme dans l’exemple suivant :


CREATE TABLE formations  (  
   nb_stagiaires int,  
   plandecours varchar(25),  
   type varchar(5) check ( type in ('intra','inter') ))  
INHERITS (prestations) ; 
 

La description de la table par la commande \d montre que les colonnes de la table mère font effectivement partie de cette nouvelle table :


clients=# \d formations  
                   Table "public.formations"  
     Colonne      |          Type            | Modificateurs  
——————————————————+——————————————————————————+———————-...

Gestion de données externes

PostgreSQL dispose de mécanismes permettant d’accéder à des données situées à l’extérieur d’une instance. L’implémentation répond au standard SQL/MED.

Cette implémentation permet d’utiliser un composant externe qui définit les méthodes utiles pour se connecter à un service, comme un serveur de base de données, ou ouvrir une ressource, comme un fichier CSV. Ces composants ne sont pas fournis avec PostgreSQL, excepté le connecteur vers PostgreSQL, mais par des projets externes. Ces implémentations sont appelées des « wrappers ».

Si ce mécanisme permet d’utiliser des données externes en lecture et en écriture, les composants spécifiques n’implémentent pas tous l’écriture de données.

Une fois le composant externe installé, il est possible de définir une connexion vers un service externe et d’établir une correspondance entre un utilisateur local à l’instance PostgreSQL avec un utilisateur autorisé à se connecter au service externe.

Enfin, une table étrangère est créée afin de faire correspondre une entité du service externe avec une relation locale à l’instance PostgreSQL.

1. Wrappers

a. Liste de wrappers disponibles

Les wrappers disponibles à l’installation ne sont pas livrés avec PostgreSQL, à l’exception des wrappers postgres_fdw et file_fdw. Selon les besoins, différents wrappers ont été développés et sont généralement disponibles sous forme de code source, en tant que logiciels libres.

Le wiki de PostgreSQL référence les projets existants à l’adresse suivante : https://wiki.postgresql.org/wiki/Foreign_data_wrappers et le dépôt pgxn en intègre quelques-uns : http://pgxn.org/tag/fdw/

Le tableau suivant résume les caractéristiques des principaux wrappers :

nom

lecture/écriture

pxgn

oracle_fdw

oui

oui

mysql_fdw

oui

oui

tds_fdw (MS-SQL Server, Sybase)

non

oui

sqlite_fdw

non

non

redis_fdw

non

oui

couchdb_fdw

non

oui

ldap_fdw

non

oui

hadoop_fdw

non

non

b. Création d’un wrapper

Cette commande rend disponible le connecteur...

Les index

Un index est un bon outil pour améliorer les performances de la base de données. L’analogie avec un livre permet de comprendre le rôle joué par un index dans une base de données. Sans index, lorsqu’un lecteur cherche une information, il doit lire le livre jusqu’à trouver ce qu’il cherche. Selon la taille du livre et l’endroit où se situe l’information, début ou fin, la recherche peut être longue. Dans la plupart des ouvrages techniques, l’éditeur place un index de quelques pages, contenant les mots-clés considérés comme étant susceptibles de faire l’objet d’une recherche afin de faciliter cette recherche. Le lecteur n’a plus qu’à rechercher dans l’index et se rendre à la page indiquée.

Les serveurs de bases de données stockent les données dans des tables et doivent lire les tables lorsqu’un utilisateur recherche une donnée. La méthode la plus simple est de parcourir séquentiellement une table, jusqu’à rencontrer la donnée recherchée. Cette méthode fonctionne bien tant que la table a un volume rendant les temps de parcours correct. Au-delà d’une limite qui dépend des types de données utilisés, du nombre de colonnes de la table et du nombre de tuples, le parcours séquentiel de la table est trop long pour obtenir des temps de réponse raisonnables. Il devient nécessaire de créer un ou plusieurs index, en fonction des recherches effectuées sur la table.

L’analogie avec le livre s’arrête là. En effet, un livre a un contenu statique, au contraire d’une base de données, dont le contenu évolue dans le temps. Cela signifie que les index doivent être mis à jour en même temps que la table. Plus une table a d’index associés, plus les temps de mise à jour lors d’une insertion, d’une mise à jour ou d’une suppression des données sont longs. Le temps susceptible d’être gagné en lecture est perdu en écriture.

La création d’un index est donc un équilibre entre les améliorations souhaitées en lecture et les baisses de performances en écriture....

Séquences et attribut d’identité

Une séquence est un type d’objet un peu particulier. Une séquence correspond à un compteur qui peut être manipulé avec quelques fonctions ; notamment la fonction nextval() qui permet d’incrémenter la valeur du compteur et de la récupérer. Ceci permet par exemple d’obtenir une sorte d’incrémentation automatique d’une colonne. De plus, il est possible de partager une même séquence entre plusieurs tables, créant ainsi un identifiant unique inter-tables.

L’attribut d’identité apparaît avec la version 10 de PostgreSQL. Il s’agit d’une fonctionnalité très proche des séquences, mais implémentant dans PostgreSQL ce qui est défini dans la norme SQL ISO.

Les types de données SERIAL et BIGSERIAL créent automatiquement une séquence et utilisent la fonction nextval() dans l’expression de la valeur par défaut de la colonne.

Dans une table comme la table prestations, la clé primaire est définie comme étant un entier. Il est possible d’utiliser une séquence pour l’alimenter automatiquement. L’exemple suivant montre l’usage le plus simple :


CREATE TABLE prestations (   prest_id serial primary key ,  
   [ ... ]   
) ; 
 

qui est l’équivalent...

Types de données

Il existe de nombreux types de données dans PostgreSQL, correspondant pour la plupart aux types de données de la norme SQL.

1. Type de données numériques

  • smallint, int2 : entier signé sur 2 octets.

  • integer, int, int4 : entier signé sur 4 octets.

  • bigint, int8 : entier signé sur 8 octets.

  • serial, serial4 : entier sur 4 octets à incrémentation automatique. C’est un entier associé à une séquence.

  • bigserial, serial8 : entier sur 8 octets à incrémentation automatique. C’est un entier associé à une séquence.

  • real, float4 : nombre à virgule flottante de simple précision sur 4 octets, avec 6 décimales.

  • double precision, float8 : nombre à virgule flottante de double précision sur 8 octets, avec 15 décimales.

  • numeric [ (p, s) ], decimal [ (p, s) ] : nombre exact de la précision indiquée. Ce type est particulièrement recommandé pour les valeurs monétaires ou tous les types numériques où la partie flottante ne doit pas varier. Les indications correspondent au nombre total de digits (p) puis à la partie décimale (s).

Il n’existe pas de types ou d’options définissant un type non signé. Les plages de valeurs sont donc définies autour du zéro.

2. Type de données « caractères »

  • char [ (n) ], character...

Domaines

Un domaine de données est une extension d’un type de données, associé à des contraintes et des vérifications qui permettent de ne définir qu’une fois cet ensemble et de le réutiliser dans plusieurs tables. Par exemple, un champ adresse_email peut être défini comme domaine et réutilisé dans toute une application.

1. Création d’un domaine

Le synopsis de la commande est le suivant :


CREATE DOMAIN nom [AS] typedonnee  
    [ DEFAULT expression ]  
    [ [ CONSTRAINT contrainte ]  
{ NOT NULL | NULL | CHECK (expression) } ] 
 

La création d’un domaine de données est très proche de la définition d’un attribut, les différentes options étant les mêmes.

2. Modification d’un domaine

La modification d’un domaine est similaire à la modification d’un attribut en utilisant la commande ALTER DOMAIN. La différence est que la plupart des modifications ne s’appliquent pas aux données des tables utilisant le domaine. Le synopsis de la commande est le suivant :


ALTER DOMAIN nom { SET DEFAULT expression | DROP DEFAULT } 
ALTER DOMAIN nom { SET | DROP } NOT NULL 
ALTER DOMAIN nom ADD contrainte [ NOT VALID ] 
ALTER DOMAIN nom DROP CONSTRAINT [ IF EXISTS ] contrainte 
[ RESTRICT | CASCADE ] 
ALTER DOMAIN...

Recherche textuelle

La recherche textuelle dans PostgreSQL est un ensemble de fonctions permettant l’analyse et l’indexation de textes en utilisant des racines des mots de ce texte, tout en fournissant des éléments de tris, en fonction de la proximité du résultat avec la recherche.

Contrairement aux expressions régulières ou à l’opérateur LIKE, ce type de recherche permet l’utilisation d’index améliorant les performances et facilite la recherche des racines de mots, en fonction d’une langue, permettant ainsi des recherches sur des mots similaires.

Les mots sont convertis en racines, ou lexèmes, permettant le rapprochement de mots similaires ayant la même racine.

Une recherche dans un texte est la correspondance entre un document de type tsvector, et une requête de type tsquery. Cette correspondance est vraie ou fausse et déterminée par l’opérateur @@.

Recherche dans une table

La recherche sur une ou plusieurs colonnes de type text dans une table passe par la conversion vers un document tsvector, ce qui permet de l’associer à une recherche tsquery. Par exemple, la requête suivante permet de rechercher le mot-clé ’Linux’ dans le champ plandecours de la table formations :


SELECT * FROM formations WHERE to_tsvector(plandecours) @@ 
to_tsquery( 'Linux');
 

Afin d’améliorer...

Extensions

Les extensions permettent d’ajouter des fonctionnalités à PostgreSQL.

Une extension est un ensemble cohérent de fonctions, types de données, opérateurs ou tout autre objet utile, fournissant une nouvelle fonctionnalité à PostgreSQL. Une extension peut être fournie par PostgreSQL ou par n’importe quel autre fournisseur.

Ces extensions peuvent aussi bien fournir de nouveaux types de données, comme ltree ou prefix, que des outils d’administration comme pg_stat_statement ou pg_buffercache.

Lorsque PostgreSQL est installé par un système de paquetages, comme sur les distributions GNU/Linux Debian, Ubuntu, Red Hat ou CentOS, un paquet spécifique contient les extensions fournies par PostgreSQL : postgresql-contrib-10 pour Debian et Ubuntu ou postgresql10-contrib pour Red Hat et CentOS.

Des extensions non fournies par PostgreSQL sont installables par le système de paquetages. Chaque extension alors fait l’objet d’un paquet spécifique, par exemple postgresql-10-ip4r pour Debian et Ubuntu ou ip4r10 pour Red Hat ou CentOS.

Ces paquets font référence à une version majeure spécifique de PostgreSQL, d’une part parce que la plupart d’entre elles sont écrites en langage C, et doivent donc être compilées en fonction de la version choisie, et d’autre part parce que les fichiers doivent être installés dans l’arborescence de la version majeure de PostgreSQL.

Une fois les fichiers contenant le code de l’extension installé, cette extension n’est pas immédiatement disponible. Il reste à créer les objets dans la base de données souhaitée, pour permettre leur utilisation, par exemple dans la création d’une table pour un type de données ou dans une requête SELECT pour une fonction.

1. Création d’une extension

L’ordre CREATE EXTENSION permet cette mise à disposition : 


CREATE EXTENSION [ IF NOT EXISTS ] extension 
    [ WITH ] [ SCHEMA nomschema ] 
    [ VERSION version ] [ FROM ancienneversion ] 
    [ CASCADE ] 
 

Par défaut, la dernière version de l’extension est installée dans le schéma courant. Lorsqu’un schéma est précisé, il doit être...

Opérateurs et fonctions

1. Opérateurs

Les listes présentées ci-après résument les opérateurs principaux disponibles dans PostgreSQL.

a. Opérateurs de comparaison

Lorsqu’un des opérandes comparés est NULL, alors la comparaison est NULL, sauf lorsque l’opérateur est IS DISTINCT FROM, NULL étant l’absence de valeur.

  • < : retourne true si l’opérande de gauche est plus petit que l’opérande de droite.

  • > : retourne true si l’opérande de gauche est plus grand que l’opérande de droite.

  • <= : retourne true si l’opérande de gauche est plus petit ou égal à l’opérande de droite.

  • >= : retourne true si l’opérande de gauche est plus grand ou égal à l’opérande de droite.

  • = : retourne true si les deux opérandes sont équivalents.

  • <> ou != : retourne true si les deux opérandes ne sont pas équivalents.

  • IS [ NOT ] DISTINCT FROM : retourne true (ou false) si les opérandes sont distincts l’un de l’autre, même si l’un des opérandes est NULL.

  • IS [ NOT ] NULL : retourne true (ou false) si l’opérande est NULL.

Les opérateurs suivants fonctionnent avec des types de données composites, comme des tableaux, des plages de valeurs ou les types de données JSON :

  • @> : retourne true si l’opérande de gauche contient l’opérande de droite.

  • <@ : retourne true si l’opérande de gauche est contenu dans l’opérande de droite.

  • && : retourne true si les deux opérandes se chevauchent.

Les opérateurs suivants fonctionnent avec des plages de valeurs :

  • >> : retourne true si l’opérande de gauche est à gauche de l’opérande de droite.

  • << : retourne true si l’opérande de gauche est à droite de l’opérande de droite.

  • &> : retourne true si l’opérande de gauche ne s’étend pas à droite de l’opérande de droite.

  • &< : retourne true si l’opérande de gauche ne s’étend pas à gauche de l’opérande de droite.

  • -|- : retourne true si l’opérande...

Manipulation des données

1. Insertion de données

Il existe deux méthodes pour alimenter des tables avec des données. La première utilise l’ordre INSERT, comme dans la norme SQL et la seconde l’ordre COPY pour notamment le cas de volumes de données importants à l’insertion.

a. L’ordre INSERT ... INTO

L’ordre INSERT respecte la notation de la norme SQL en apportant quelques modifications.

Le synopsis de l’ordre INSERT est le suivant :


[ WITH [ RECURSIVE ] requête_cte [, ...] ]  
INSERT INTO table   
    [ ( colonne [, ...] ) ]   
    {   
    DEFAULT VALUES |   
         VALUES ( { expression | DEFAULT } [, ...] ) |   
         requête   
          }   
    [ ON CONFLICT [ ON CONSTRAINT contrainte ]  
      DO NOTHING | DO UPDATE SET { colonne = expression } [, ...]
[ WHERE condition ] ]  
   [ RETURNING * | expr ] 

Selon le nom de la table, la liste des colonnes permet d’indiquer celles qui seront utilisées. Lorsque toutes les colonnes de la table sont utilisées, cette liste n’est pas obligatoire.

Pour chaque colonne, la valeur est exprimée soit avec sa valeur littérale, soit avec une expression, en respectant l’ordre des colonnes indiqué dans la première partie de la commande.

L’exemple qui suit montre une insertion simple :


INSERT INTO clients (cl_nom, cl_adresse) VALUES ('S.T.E.R.E.G', 
'2 rue des Incas, 25340 St-Anois') ; 
 

Dans ce cas, les colonnes qui ne sont pas utilisées prendront la valeur par défaut indiquée dans la définition de la table.

Il est aussi possible de ne pas utiliser les noms des colonnes, comme dans l’exemple suivant :


INSERT INTO prestations VALUES ( 1 , 'intitule' ,  
 ,  '' , '13/06/2006', '12/06/2006', true ,'') ; 
 

Dans ce cas, les valeurs de toutes les colonnes sont exprimées. Il est alors possible d’indiquer le mot-clé DEFAULT pour utiliser la valeur par défaut indiquée dans la définition de la table.

L’utilisation de sous-requêtes CTE est possible, comme dans...