Ce chapitre couvre la création des structures de données amenées à
contenir les données. Dans une base relationnelle, les données brutes
sont stockées dans des tables. De ce fait, une grande partie de ce
chapitre est consacrée à l'explication de la création et de la
modification des tables et aux fonctionnalités disponibles pour
contrôler les données stockées dans les tables. L'organisation des
tables dans des schémas et l'attribution de privilèges sur les tables
sont ensuite décrits. Pour finir, d'autres fonctionnalités, telles
que l'héritage, les vues, les fonctions et les déclencheurs sont
passées en revue.
5.1. Notions fondamentales sur les tables
Une table dans une base relationnelle ressemble beaucoup à un
tableau sur papier : elle est constituée de lignes et de colonnes.
Le nombre et l'ordre des colonnes sont fixes et chaque colonne a un
nom. Le nombre de lignes est variable -- il représente le nombre de
données stockées à un instant donné.
Le SQL n'apporte aucune garantie sur l'ordre des lignes dans une
table. Quand une table est lue, les lignes apparaissent dans un
ordre aléatoire, sauf si un tri est demandé explicitement. Tout
cela est expliqué dans le Chapitre 7,
Requêtes.
De plus, le SQL n'attribue pas d'identifiant unique aux lignes. Il
est donc possible d'avoir plusieurs lignes identiques au sein d'une
table. C'est une conséquence du modèle mathématique sur lequel
repose le SQL, même si cela n'est habituellement pas souhaitable.
Il est expliqué plus bas dans ce chapitre comment traiter ce
problème.
Chaque colonne a un type de donnée. Ce type de donnée limite
l'ensemble de valeurs qu'il est possible d'attribuer à une colonne.
Il attribue également une sémantique aux données stockées dans la
colonne pour permettre les calculs sur celles-ci. Par exemple, une
colonne déclarée dans un type numérique n'accepte pas les chaînes
textuelles ; les données stockées dans une telle colonne peuvent
être utilisées dans des calculs mathématiques. Par opposition, une
colonne déclarée de type chaîne de caractères accepte pratiquement
n'importe quel type de donnée mais ne se prête pas aux calculs
mathématiques. D'autres types d'opérations, telle la concaténation
de chaînes, sont cependant disponibles.
PostgreSQL™ inclut un
ensemble conséquent de types de données intégrés pour s'adapter à
diverses applications. Les utilisateurs peuvent aussi définir leurs
propres types de données.
La plupart des types de données intégrés ont des noms et des
sémantiques évidents. C'est pourquoi leur explication détaillée est
reportée au Chapitre 8, Types de
données.
Parmi les types les plus utilisés, on trouve integer pour les entiers, numeric pour les éventuelles fractions, text pour les chaînes de caractères, date pour les dates, time
pour les heures et timestamp pour les
valeurs qui contiennent à la fois une date et une heure.
Pour créer une table, on utilise la commande bien nommée CREATE
TABLE. Dans cette commande, il est nécessaire d'indiquer, au
minimum, le nom de la table, les noms des colonnes et le type de
données de chacune d'elles. Par exemple :
CREATE TABLE ma_premiere_table (
premiere_colonne text,
deuxieme_colonne integer
);
Cela crée une table nommée ma_premiere_table avec deux colonnes. La première
colonne, nommée premiere_colonne, est de
type text ; la seconde colonne, nommée
deuxieme_colonne, est de type integer. Les noms des table et colonnes se conforment
à la syntaxe des identifiants expliquée dans la Section 4.1.1,
« Identifieurs et mots clés ». Les noms des types
sont souvent aussi des identifiants mais il existe des exceptions.
Le séparateur de la liste des colonnes est la virgule. La liste
doit être entre parenthèses.
L'exemple qui précède est à l'évidence extrêmement simpliste. On
donne habituellement aux tables et aux colonnes des noms qui
indiquent les données stockées. L'exemple ci-dessous est un peu
plus réaliste :
CREATE TABLE produits (
no_produit integer,
nom text,
prix numeric
);
(Le type numeric peut stocker des
fractions telles que les montants.)
Astuce
Quand de nombreuses tables liées sont créées, il est préférable
de définir un motif cohérent pour le nommage des tables et des
colonnes. On a ainsi la possibilité d'utiliser le pluriel ou le
singulier des noms, chacune ayant ses fidèles et ses
détracteurs.
Le nombre de colonnes d'un table est limité. En fonction du type de
colonnes, il oscille entre 250 et 1600. Définir une table avec un
nombre de colonnes proche de cette limite est, cependant, très
inhabituel et doit conduire à se poser des questions quant à la
conception du modèle.
Lorsqu'une table n'est plus utile, elle peut être supprimée à
l'aide de la commande DROP TABLE. Par exemple :
DROP TABLE ma_premiere_table;
DROP TABLE produits;
Tenter de supprimer une table qui n'existe pas lève une erreur. Il
est, néanmoins, habituel dans les fichiers de scripts SQL d'essayer
de supprimer chaque table avant de la créer. Les messages d'erreur
sont alors ignorés afin que le script fonctionne que la table
existe ou non. (La variante DROP TABLE IF
EXISTS peut aussi être utilisée pour éviter les messages
d'erreur mais elle ne fait pas partie du standard SQL.)
Pour la procéduure de modification d'une table qui existe déjà,
voir la Section 5.5,
« Modification des tables » plus loin dans ce
chapitre.
Les outils précédemment décrits permettent de créer des tables
fonctionnelles. Le reste de ce chapitre est consacré à l'ajout de
fonctionnalités à la définition de tables pour garantir l'intégrité
des données, la sécurité ou l'ergonomie. Le lecteur impatient
d'insérer des données dans ses tables peut sauter au Chapitre 6,
Manipulation de données et lire le reste de ce chapitre plus
tard.