Chapitre 5. Définition des données

Table des matières
5.1. Bases sur les tables
5.2. Colonnes Systèmes
5.3. Valeurs par défaut
5.4. Contraintes
5.4.1. Contraintes de Vérification
5.4.2. Contraintes Non Nulles
5.4.3. Contraintes Uniques
5.4.4. Clés Primaires
5.4.5. Clés Étrangères
5.5. Héritage
5.6. Modification des Tables
5.6.1. Ajouter une colonne
5.6.2. Retirer une Colonne
5.6.3. Ajouter une Contrainte
5.6.4. Retirer une Contrainte
5.6.5. Modifier la valeur par défaut
5.6.6. Renommer une colonne
5.6.7. Renommer une Table
5.7. Privilèges
5.8. Schémas
5.8.1. Créer un Schéma
5.8.2. Le Schéma Public
5.8.3. Le Chemin de Recherche de Schéma
5.8.4. Schémas et Privilèges
5.8.5. Le Catalogue de Système de Schéma
5.8.6. Méthodes d'Utilisation
5.8.7. Portabilité
5.9. D'autres Objets Base de Données
5.10. Gestion des Dépendances

Ce chapitre couvre la création de structures de données qui contiendront les données de quelqu'un. Dans une base relationnelle, les données brutes sont stockées dans des tables. Du coup, la plus grande partie de ce chapitre sera consacrée à l'explication de la création et de la modification des tables et des fonctions disponibles pour contrôler les données stockées dans les tables. Ensuite, nous discuterons de l'organisation de tables en schémas, et comment des droits peuvent être attribués aux tables. Enfin, nous verrons brièvement d'autres fonctionnalités, tel que les vues, les fonctions et les déclencheurs.

5.1. Bases sur les tables

Une table dans une base relationnelle ressemble beaucoup à un tableau sur papier : elle est constituée de rangées et de colonnes. Le nombre et l'ordre des colonnes sont fixés et chaque colonne a un nom. Le nombre de rangées est variable -- il représente la quantité de données stockées à un moment donné. SQL n'apporte aucune garantie sur l'ordre des rangées dans une table. Quand une table est lue, les rangées apparaîtront dans un ordre aléatoire sauf si un tri est demandé explicitement. Ceci est couvert dans Chapitre 7. De plus, SQL n'attribue pas d'identifiant unique aux rangées. Du coup, il est possible d'avoir plusieurs rangées complètement identiques dans une table. Ceci est une conséquence du modèle mathématique sur lequel repose SQL mais n'est habituellement pas désiré. Plus tard dans ce chapitre, nous verrons comment traiter ce problème.

Chaque colonne a un type de donnée. Ce type de donnée restreint la série de valeurs possibles qui peuvent être attribuées à une colonne et attribue des sémantiques à la donnée stockée dans la colonne pour qu'elles puissent être utilisées pour des calculs. Par exemple, une colonne déclarée comme étant d'un type numérique n'acceptera pas une chaîne arbitraire de texte, et les données stockées dans une telle table peuvent être utilisées dans des calculs mathématiques. Par opposition, une colonne déclarée comme étant de type chaîne de caractères acceptera pratiquement n'importe quel type de donnée mais ne se prêtera pas à des calculs mathématiques bien que d'autres opérations tel que la concaténation des chaînes sont disponibles.

PostgreSQL inclut une série conséquente de types de données intégrés qui correspondent à plusieurs 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 alors nous reportons une explication détaillée à Chapitre 8. Quelques-uns des types les plus utilisés sont integer pour les entiers, numeric pour les nombres pouvant être fractionnels, text pour les chaînes de caractères, date pour les dates, time pour les valeurs de type heure et timestamp pour les valeurs contenant et une date et une heure.

Pour créer une table, il faut utiliser la commande bien nommée CREATE TABLE. Dans cette commande, vous devez spécifier au moins le nom de la nouvelle table, les noms des colonnes et le type de données pour chacune des colonnes. Par exemple :

CREATE TABLE ma_premiere_table (
    premiere_colonne text,
    deuxieme_colonne integer
);

Ceci crée une table nommée ma_premiere_table avec deux colonnes. La première colonne est nommée premiere_colonne et a un type de données text ; la seconde colonne porte le nom deuxieme_colonne et le type integer. Les noms de table et colonnes suivent la syntaxe d'identification expliquée dans Section 4.1.1. Les noms des types sont souvent aussi des identifiants mais il y a des exceptions. Notez que la liste des colonnes est séparée par des virgules et entourée par des parenthèses.

Bien sur, l'exemple précédant est un peu tiré par les cheveux. Normalement, on donne aux tables et aux colonnes des noms indiquant quels types de données ils stockent. Alors voyons un exemple plus réaliste :

CREATE TABLE produits (
    no_produit integer,
    nom text,
    prix numeric
);

(Le type numeric peut stocker des composants fractionnels comme on pourrait s'y attendre de montants monétaires.)

Astuce : Quand vous créez des tables liées entre elles, il est prudent de choisir des règles de nommage pour les tables et les colonnes. Par exemple, il peut y avoir le choix d'utiliser des noms au pluriel ou au singulier pour les noms de table, chaque choix ayant les faveurs d'un théoricien ou d'un autre.

Il y a une limite sur le nombre de colonnes qu'une table peut contenir. Suivant le type de colonne, elle peut être entre 250 et 1600. Par contre, définir une table avec un nombre de colonnes proche de ceux-ci est très inhabituel et est souvent la preuve d'une conception douteuse.

Si vous n'avez plus besoin d'une table, vous pouvez la retirer en utilisant la commande DROP TABLE. Par exemple :

DROP TABLE ma_premiere_table;
DROP TABLE produits;

Tenter de supprimer une table qui n'existe pas est une erreur. Malgré cela, il est habituel dans des fichiers de scripts SQL d'essayer de supprimer chaque table avant de la créer, tout en ignorant les messages d'erreur.

Si vous avez besoin de modifier une table qui existe déjà, regardez Section 5.6 plus loin dans ce chapitre.

Avec les outils dont nous avons déjà discuté, vous pouvez 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 la facilité. Si vous êtes impatients de remplir vos tables avec des données tout de suite, vous pouvez sauter au Chapitre 6 et lire le reste de ce chapitre plus tard.