Documentation PostgreSQL 7.4.29 | ||||
---|---|---|---|---|
Précédent | Arrière rapide | Chapitre 5. Définition des données | Avance rapide | Suivant |
Créons deux tables. La table capitales contient les capitales d'état qui sont aussi des villes. Naturellement, la table capitales doit hériter de villes.
CREATE TABLE villes ( name text, population float, altitude int -- (in ft) ); CREATE TABLE capitales ( state char(2) ) INHERITS (villes);
Dans ce cas une rangée de capitales hérite tout les attributs (nom, population, et altitude) de son parent villes. Le type de l'attribut name est text, un type natif de PostgreSQL pour des chaînes de caractères de longueur variable. Le type de l'attribut population est float, un type natif de PostgreSQL pour les nombres flottants de précision double. Les capitales d'états ont un attribut supplémentaire state qui donne leur état. Dans PostgreSQL, une table peut hériter de zéro tables ou plus et une requête peut référencer toutes les rangées d'une table ou toutes les rangées d'une table plus celles de ses descendants.
Note : La hiérarchie d'héritage est en fait un graphe acyclique dirigé.
Par exemple, la requête suivante cherche les noms de toutes les villes, y compris les capitales d'état, qui se situent à une altitude de plus de 500 pieds:
SELECT name, altitude FROM villes WHERE altitude > 500;
qui retourne:
name | altitude -----------+---------- Las Vegas | 2174 Mariposa | 1953 Madison | 845
D'un autre côté, la requête suivante cherche toutes les villes qui ne sont pas des capitales d'état et qui sont situés à une altitude de plus de 500 pieds:
SELECT name, altitude FROM ONLY villes WHERE altitude > 500; name | altitude -----------+---------- Las Vegas | 2174 Mariposa | 1953
Ici, le << ONLY >> avant villes indique que la requête ne devrait être lancée que sur villes et non les tables en dessous de villes dans la hiérarchie d'héritage. Beaucoup des commandes donc nous avons déjà discuté -- SELECT, UPDATE et DELETE -- gèrent cette syntaxe << ONLY >>.
Dans certain cas, vous souhaiterez savoir dans quel table provient une rangée donnée. Il y a une colonne système appelée TABLEOID dans chaque table qui peut vous donner la table d'origine:
SELECT c.tableoid, c.name, c.altitude FROM villes c WHERE c.altitude > 500;
qui renvoie :
tableoid | name | altitude ----------+-----------+---------- 139793 | Las Vegas | 2174 139793 | Mariposa | 1953 139798 | Madison | 845
(Si vous essayez de reproduire cet exemple, vous obtiendrez probablement des OIDs numériques différents.) En faisant une jointure avec pg_class, vous pourrez voir les noms de tables actuelles:
SELECT p.relname, c.name, c.altitude FROM villes c, pg_class p WHERE c.altitude > 500 and c.tableoid = p.oid;
ce qui retourne:
relname | name | altitude -----------+-----------+---------- villes | Las Vegas | 2174 villes | Mariposa | 1953 capitales | Madison | 845
Obsolète : Dans les versions précédentes de PostgreSQL, le comportement par défaut était de ne pas inclure les tables filles dans les requêtes. Ceci provoquait des erreurs et était aussi en violation du standard SQL99. Sous l'ancienne syntaxe, pour avoir les sous-tables, il fallait ajouter * au nom de la table. Par exemple
SELECT * from villes*;Vous pouvez toujours préciser explicitement les tables filles en rajoutant * en plus de spécifier explicitement de ne pas parcourir les tables filles en écrivant << ONLY >>. Mais, a partir de la version 7.1, le comportement par défaut pour un nom de table brut est de parcourir aussi ses tables filles bien qu'avant, la norme était de ne pas le faire. Pour retrouver l'ancien comportement, mettez l'option de configuration SQL_Inheritance à off, i.e.,
SET SQL_Inheritance TO OFF;ou ajoutez une ligne dans votre fichier postgresql.conf.
Une limite de la fonctionnalité d'héritage est que les indexes (y compris les contraintes uniques) et les contraintes de clés étrangères ne s'appliquent qu'aux tables seules et non leurs descendants d'héritage. Donc, dans l'exemple précédant, spécifier qu'une colonne d'une autre table REFERENCES villes(name) autorisera l'autre table a contenir des noms de villes mais pas de noms de capitales. Cette lacune sera probablement corrigée dans une future version.
Précédent | Sommaire | Suivant |
Contraintes | Niveau supérieur | Modification des Tables |