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 non spécifié, sauf si un tri est demandé explicitement. Tout cela est expliqué dans le Chapitre 7. 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ées. Ce type 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 important 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.
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 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 tables et des colonnes se conforment à la syntaxe des
identifiants expliquée dans la Section 4.1.1.
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.)
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'une table est limité. En fonction du type de données des 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édure de modification d'une table qui existe déjà, voir la Section 5.7 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 et lire le reste de ce chapitre plus tard.