Sous PostgreSQL 8, il est possible de définir des nouveaux types de données permettant d'être utilisés dans les tables de la même façon que les types simples integer ou varchar. Un type composite permet de décrire la structure d'un enregistrement (row) de la même façon qu'on le ferait pour une table en combinant différents types existants. On peut ensuite utiliser ce nouveau type pour définir une colonne d'une table.
Par exemple, pour créer un nouveau type définissant la structure d'une adresse :CREATE TYPE address AS (
On peut ensuite créer la table en incluant ce type :
civic_number varchar,
street_name varchar,
local varchar,
city varchar,
state varchar,
country varchar,
zipcode varchar
);CREATE TABLE addressbook (
On aurait aussi pu inclure un autre champ address_work du type address pour en gérer plusieurs dans le carnet.
pk_file serial,
firstname varchar(50),
lastname varchar(50),
address_home address
);
Une insertion typique dans la table :
INSERT INTO addressbook (firstname, lastname, address_home) VALUES ('Bill', 'Gates', ROW('1835', '73rd Ave', '-', 'Medina', 'Washington', 'USA', '98039') )
La sélection du champ d'adresse retournera la valeur du champ :
SELECT address_home FROM addressbook
address_homePour obtenir les valeurs et la structure (plus pratique pour un recordset), on peut référer à certaines colonnes champs comme suit (ou les inclure toutes avec (address_home).*) :
--------------------------------------------------------
(1835,"73rd Ave","",Medina,Washington,USA,98039)
SELECT (address_home).street_name, (address_home).zipcode FROM addressbook
street_name zipcode
--------------------------------------------------------
73rd Ave 98039
Salut,
comment réaliser l'enregistrement dans une table de cette structure ?
CREATE TABLE addressbook (
pk_file serial,
firstname varchar(50),
lastname varchar(50),
address_home address[]
);
PS: l'attribut address_home est maintenant un tableau !
Je ne connaissais pas la réponse à ta question alors j'en ai profité pour tester la création de table avec un champ "tableau de type composé" sur deux environnement différents.
Sous Postgres 8.2.4, ça semble impossible. Par contre, sous la version 8.4.8, je n'ai eu aucune difficulté à faire un create table avec un champ address_home address[]. Je crois que c'est une nouvelle fonctionnalité depuis Postgres 8.3.