CREATE [ TEMPORARY | TEMP ] TABLE table ( column type [ NULL | NOT NULL ] [ UNIQUE ] [ DEFAULT value ] [column_constraint_clause | PRIMARY KEY } [ ... ] ] [, ... ] [, PRIMARY KEY ( column [, ...] ) ] [, CHECK ( condition ) ] [, table_constraint_clause ] ) [ INHERITS ( inherited_table [, ...] ) ] |
La table est créée seulement pour la durée de la session, elle est automatiquement supprimée en quittant cette session. Les tables permanentes avec le même nom ne sont pas visibles pendant que la table temporaire existe.
Nom de la nouvelle table a créer.
nom d'une colonne.
type de la colonne. Ceci peut inclure des spécificateurs de tableaux. Voir les types et les tableaux pour plus d'information.
Valeur par défaut pour une colonne. Voir la clause DEFAULT pour plus d'information.
Les clauses optionnelles contrainte de colonne spécifient une liste de contraintes d'intégrité ou testent les nouvelles entrées où les entrées mises à jour doivent satisfaire une opération insert ou update avec succès. Chaque contrainte doit évaluer une expression booléenne. Bien que SQL92 requiert column_constraint_clause en référence à cette colonne seule, Postgres fournit de multiples colonnes destinées a être référencées dans une contrainte de colonne unique.
La clause optionnelle CONSTRAINT de table spécifie une liste de contraintes d'intégrité par lesquelles les nouvelles entrées ou les entrées mises à jour doivent satisfaire une opération insert ou update avec succès. Chaque contrainte doit évaluer une expression booléenne. De multiples colonnes peuvent être référencées dans une seule contrainte. Seule une clause PRIMARY KEY peut être spécifiée pour une table; PRIMARY KEY column (une contrainte de table) et PRIMARY KEY (une contrainte de colonne) sont mutuellement exclusives...Voir la clause contrainte de table pour plus d'information.
La clause optionnelle INHERITS spécifie une collection de noms de tables depuis lesquelles la table hérite automatiquement de tous les champs. Si certains noms de champs hérités apparaîssent plus d'une fois, Postgres retourne une erreur. Postgres fournit automatiquement à la table créée les fonctions des tables au-dessus dans la hiérarchie héritage.
Aside | |
---|---|
héritage et fonctions suivent les conventions du Common Lisp Object System (CLOS). |
message retourné si la table a été créée correctement.
message retourné si la création a échoué. Ce qui est habituellement accompagné par un texte descriptif, comme : ERROR: Relation 'table' already exists qui apparaît au lancement, si la table spécifiée existe déja dans la base.
si le type de la valeur par défaut ne s'apparie pas avec le type de la colonne définition.
CREATE TABLE insérera une nouvelle table dans la base courante. La table sera propriété de l'utilisateur ayant généré la commande.
La nouvelle table est créée comme un bloc sans donnée initiale. Une table ne peut avoir plus de 1600 colonnes (en réalité, c'est limité par le fait que la taille des tuples doit être inférieure à 8192 octets), mais cette limite peut être configurée plus basse pour certains sites. Une table ne peut avoir le même nom qu'une table du catalogue système.
DEFAULT value |
les valeurs possibles pour l'expression default value sont :
une valeur litérale
une fonction utilisateur
une fonction sans paramètres
La clause default affecte une valeur par défaut à une colonne (via une colonne de définition dans la clause CREATE TABLE). Le type d'une valeur par défaut doit être identique au type de la colonne de définition.
Une opération INSERT qui inclut une colonne sans valeur par défaut spécifiée assignera la valeur NULL à la colonne si aucune valeur de donnée explicite ne lui est fournie. Default literal signifie que la valeur par défaut est la valeur constante spécifiée. Default niladic-function ou user-function signifie que la valeur par défaut est la valeur de la fonction spécifiée au moment de l'INSERT.
Il existe deux types de fonction sans paramètres:
Voir la fonction CURRENT_USER
pas encore supporté
pas encore supporté
Voir la fonction CURRENT_DATE
Voir la fonction CURRENT_TIME
Voir la fonction CURRENT_TIMESTAMP
Dans cette version (6.5), Postgres évalue toutes les expressions par défaut au moment où la table est définie. À partir de là, les fonctions qui sont "non-cacheable" comme CURRENT_TIMESTAMP pourront ne pas produire l'effet désiré. Pour le cas particulier des types date/time, on peut utiliser "DEFAULT TEXT 'now'" au lieu de "DEFAULT 'now'" ou "DEFAULT CURRENT_TIMESTAMP". Ceci force Postgres à considérer la constante comme type chaîne et à convertir la valeur en timestamp au lancement.
Pour assigner une valeur constante comme défaut pour les colonnes did et number, et une chaîne littérale à la colonne did :
CREATE TABLE video_sales ( did VARCHAR(40) DEFAULT 'luso films', number INTEGER DEFAULT 0, total CASH DEFAULT '$0.0' ); |
Pour assigner une séquence existante comme défaut pour la colonne did, et une littérale à la colonne name :
CREATE TABLE distributors ( did DECIMAL(3) DEFAULT NEXTVAL('serial'), name VARCHAR(40) DEFAULT 'luso films' ); |
[ CONSTRAINT name ] { [ NULL | NOT NULL ] | UNIQUE | PRIMARY KEY | CHECK constraint } [, ...] |
nom arbitraire donné à la contrainte d'intégrité. Si name n'est pas spécifié, il est généré depuis les noms de table et de colonne, lesquels ne s'appliqueront uniquement qu'à name.
colonne qui contient les valeurs NULL. C'est la cas par défaut.
colonne qui ne peut contenir les valeurs NULL. équivalent à la contrainte CHECK (column NOT NULL).
la colonne doit avoir des valeurs uniques. Dans Postgres, ceci est renforcé par une création implicite d'un index unique sur la table.
cette colonne est une clé primaire, ce qui implique qu'elle est unique sur le système et que les autres tables peuvent s'en servir comme identifiant unique pour les lignes. Voir PRIMARY KEY pour plus d'information.
définition d'une contrainte.
Une contrainte est une règle nommée : un objet SQL qui aide à définir des ensembles valides de valeurs en mettant des limites sur les résultats des opérations INSERT, UPDATE ou DELETE exécutées sur la Table Base.
Il y a deux moyens pour définir l'intégrité des contraintes : les contraintes de table et les contraintes de colonnes colonnes.
Une contrainte de colonne est une contrainte d'intégrité définie comme une partie d'une définition d'une colonne, et qui devient logiquement une contrainte de table aussitôt qu'elle est créée. (NdT. en d'autres termes les contraintes de colonnes permettent de spécifier différentes contraintes d'intégrité portant sur un seul attribut, y compris les contraintes référentielles). Les contraintes de colonne disponibles sont :
PRIMARY KEY |
REFERENCES |
UNIQUE |
CHECK |
NOT NULL |
Postgres dans cette version (6.5) ne supporte pas encore les contraintes d'intégrité REFERENCES. Le parser accepte la syntaxe REFERENCES mais ignore la clause. |
[ CONSTRAINT name ] NOT NULL |
La contrainte NOT NULL spécifie la règle telle qu'une colonne peut contenir seulement des valeurs non-null. C'est une contrainte de colonne seulement, et ne fournit pas une contrainte de table.
[ CONSTRAINT name ] UNIQUE |
cette erreur apparaît au lancement lors de la tentative d'insertion d' une valeur dupliquée dans une colonne.
La contrainte UNIQUE spécifie comme règle qu'un groupe d'une ou plusieurs colonnes d'une table ne peut contenir que des valeurs uniques.
Les définitions de colonne des colonnes spécifiées n'ont pas à inclure de contrainte NOT NULL pour être inclues dans une contrainte UNIQUE. En ayant plus d'une valeur null dans une colonne sans une contrainte NOT NULL, ceci ne violera pas une contrainte UNIQUE (ce qui dévie de la définition SQL92, mais est une convention plus sensible).
Chaque contrainte de colonne UNIQUE doit nommer une colonne qui est différente de la mise en place des colonnes nommées par n'importe quelle autre contrainte UNIQUE ou PRIMARY KEY définie pour la table.
Postgres crée automatiquement un index unique pour chaque contrainte UNIQUE, pour assurer l'intégrité des données. |
Definit une contrainte de colonne UNIQUE pour la table distributors. Une contrainte de colonne UNIQUE ne peut être définie que sur une seule colonne de la table.
CREATE TABLE distributors ( did DECIMAL(3), name VARCHAR(40) UNIQUE ); |
CREATE TABLE distributors ( did DECIMAL(3), name VARCHAR(40), UNIQUE(name) ); |
[ CONSTRAINT name ] CHECK ( condition [, ...] ) |
nom arbitraire donné à une contrainte.
n'importe quelle expression conditionnelle valide évaluant un résultat booléen.
erreur apparaîssant lors de la tentative d'insertion d'une valeur illégale dans une colonne sujet d'une contrainte CKECK.
La contrainte CHECK spécifie une restriction sur les valeurs admises dans une colonne. La contrainte CHECK est aussi admise comme contrainte de table.
La contrainte de colonne CHECK de SQL92 peut seulement être définie sur, et en référence à, une colonne de la table. Postgres n'a pas cette restriction.
[ CONSTRAINT name ] PRIMARY KEY |
apparaît au lancement lors de la tentative d'insertion d'une valeur dupliquée dans une colonne sujet d'une contrainte PRIMARY KEY.
La contrainte de colonne PRIMARY KEY spécifie qu'une colonne d'une table peut contenir seulement des valeurs non-NULL uniques (non-duplicate). La définition de la colonne spécifiée n'a pas à inclure une contrainte NOT NULL explicite pour être inclue dans une contrainte PRIMARY KEY.
Une seule PRIMARY KEY peut être spécifiée pour une table.
Postgres crée automatiquement un index unique pour assurer l'intégrité des données.
La contrainte PRIMARY KEY nommerait un ensemble de colonnes qui est différent des autres ensembles de colonnes nommées par une contrainte UNIQUE définie pour la même table, il résultera une duplication des index équivalents et un improductif lancement additionnel. Cependant Postgres ne rejette pas spécifiquement celà.
[ CONSTRAINT name ] { PRIMARY KEY | UNIQUE } ( column [, ...] ) [ CONSTRAINT name ] CHECK ( constraint ) |
nom arbitraire donné à une contrainte d'intégrité.
Le(s) nom de colonne pour laquelle définir un index unique et, pour PRIMARY KEY, une contrainte NOT NULL.
expression booléenne a évaluer comme contrainte.
Les sorties possibles pour la clause constrainte de table sont les mêmes que pour les portions correspondantes de la clause constrainte de colonne.
Une contrainte de table est une contrainte d'intégrité définie sur une ou plusieurs colonnes d'une table base. Les quatre variations d'une "Table Constraint" sont :
UNIQUE |
CHECK |
PRIMARY KEY |
FOREIGN KEY |
Postgres ne supporte pas encore (v.6.5) les contraintes d'intégrité FOREIGN KEY. Le parser comprend la syntaxe FOREIGN KEY, mais renvoie une note et ignore la clause. Les clés étrangères peuvent être partiellement émulées par les déclencheurs. |
[ CONSTRAINT name ] UNIQUE ( column [, ...] ) |
nom arbitaire donné à la contrainte.
nom d'une colonne dans une table.
erreur qui apparaît au lancement lors de la tentative d'insertion d'une valeur dupliquée dans une colonne.
La contrainte UNIQUE spécifie comme règle qu'un groupe d'une ou plusieurs colonnes distinctes d'une table peut contenir seulement des valeurs uniques. Le comportement de la contrainte de table UNIQUE est le même que pour les contraintes de colonnes, avec la possibilité supplémentaire de s'appliquer sur plusieurs colonnes.
Voir la section sur la contrainte de colonne UNIQUE pour plus de détails.
[ CONSTRAINT name ] PRIMARY KEY ( column [, ...] ) |
nom arbitraire pour la contrainte.
nom d'une ou plusieurs colonnes dans la table.
apparaît au lancement lors de la tentative d'insertion d'une valeur dupliquée dans une colonne sujet d'une contrainte PRIMARY KEY.
La contrainte PRIMARY KEY spécifie comme règle qu'un groupe d'une ou plusieurs colonnes distinctes d'une table peut contenir seulement des valeurs non-null (non-duplicate) uniques. Les définitions de colonne des colonnes spécifiées n'ont pas à inclure une contrainte NOT NULL pour être inclues dans une contrainte PRIMARY KEY. La contrainte de table PRIMARY KEY est similaire en ceci aux contraintes colonne, avec la possibilité additionnelle de comporter des colonnes multiples.
La contrainte de table PRIMARY KEY est similaire en celà aux contraintes de colonne, avec la possibilité supplémentaire de pouvoir comporter plusieurs colonnes.
Voir la section sur la contrainte de colonne PRIMARY KEY pour plus d'information.
Créons une table films et une table distributors
CREATE TABLE films ( code CHARACTER(5) CONSTRAINT firstkey PRIMARY KEY, title CHARACTER VARYING(40) NOT NULL, did DECIMAL(3) NOT NULL, date_prod DATE, kind CHAR(10), len INTERVAL HOUR TO MINUTE ); |
CREATE TABLE distributors ( did DECIMAL(03) PRIMARY KEY DEFAULT NEXTVAL('serial'), name VARCHAR(40) NOT NULL CHECK (name <> '') ); |
créons une table avec un tableau bi-dimensionnel
CREATE TABLE array ( vector INT[][] ); |
définissons une contrainte de table UNIQUE pour la table films. Les contraintes de table UNIQUE peuvent être définies sur une ou plusieurs colonnes de la table
CREATE TABLE films ( code CHAR(5), title VARCHAR(40), did DECIMAL(03), date_prod DATE, kind CHAR(10), len INTERVAL HOUR TO MINUTE, CONSTRAINT production UNIQUE(date_prod) ); |
définit une contrainte de colonne CHECK
CREATE TABLE distributors ( did DECIMAL(3) CHECK (did > 100), name VARCHAR(40) ); |
définit une contrainte de table CHECK
CREATE TABLE distributors ( did DECIMAL(3), name VARCHAR(40) CONSTRAINT con1 CHECK (did > 100 AND name > '') ); |
définit une contrainte de table PRIMARY KEY pour la table films. Les contraintes de table PRIMARY KEY peuvent être définies sur une ou plusieurs colonnes de la table
CREATE TABLE films ( code CHAR(05), title VARCHAR(40), did DECIMAL(03), date_prod DATE, kind CHAR(10), len INTERVAL HOUR TO MINUTE, CONSTRAINT code_title PRIMARY KEY(code,title) ); |
définit une contrainte de colonne PRIMARY KEY pour les tables distributors. Les contraintes de colonne PRIMARY KEY peuvent seulement être définies sur une colonne de la table (les deux exemples suivants sont équivalents)
CREATE TABLE distributors ( did DECIMAL(03), name CHAR VARYING(40), PRIMARY KEY(did) ); |
CREATE TABLE distributors ( did DECIMAL(03) PRIMARY KEY, name VARCHAR(40) ); |
En plus de la table temporaire, SQL92 définit aussi une clause CREATE GLOBAL TEMPORARY TABLE, et optionnellement une clause ON COMMIT :
CREATE GLOBAL TEMPORARY TABLE table ( column type [ DEFAULT value ] [ CONSTRAINT column_constraint ] [, ...] ) [ CONSTRAINT table_constraint ] [ ON COMMIT { DELETE | PRESERVE } ROWS ] |
Pour les tables temporaires, la clause CREATE GLOBAL TEMPORARY TABLE nomme une nouvelle table visible par les clients et définit les contraintes de colonne et de table.
La clause optionnelle ON COMMIT de CREATE TEMPORARY TABLE spécifie si oui ou non la table temporaire doit être vidée des lignes quand COMMIT est exécuté. Si la clause ON COMMIT est omise l'option par défaut, ON COMMIT DELETE ROWS, est supposée.
Pour créer une table temporaire :
CREATE TEMPORARY TABLE actors ( id DECIMAL(03), name VARCHAR(40), CONSTRAINT actor_id CHECK (id < 150) ) ON COMMIT DELETE ROWS; |
SQL92 spécifie certaines possibilités supplémentaires pour UNIQUE :
Définition d'une contrainte de table :
[ CONSTRAINT name ] UNIQUE ( column [, ...] ) [ { INITIALLY DEFERRED | INITIALLY IMMEDIATE } ] [ [ NOT ] DEFERRABLE ] |
Définition d'une contrainte de colonne :
[ CONSTRAINT name ] UNIQUE [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ] |
La "contrainte" NULL (actuellement une non-contrainte), est une extension Postgres vers SQL92 et est incluse pour des raisons de symétrie avec la clause NOT NULL. Comme c'est la valeur par défaut pour les colonnes, sa présence n'est que du bruit.
[ CONSTRAINT name ] NULL |
SQL92 spécifie certaines possibilités supplémentaires pour NOT NULL :
[ CONSTRAINT name ] NOT NULL [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ] |
SQL92 spécifie certaines possibilités additionnelles pour les contraintes, et définit également des assertions et des contraintes de domaine.
Postgres ne supporte pas encore les domaines et les assertions. |
Une assertion est un type spécial de contrainte d'intégrité et partage le même espace de nom que les autres contraintes. Cependant, une assertion n'est pas nécessairement dépendante d'une table base comme le sont les contraintes, ainsi SQL92 fournit la clause CREATE ASSERTION comme méthode alternative pour définir une contrainte :
CREATE ASSERTION name CHECK ( condition ) |
Les contraintes de domaine sont définies par les clauses CREATE DOMAIN ou ALTER DOMAIN :
contrainte de domaine :
[ CONSTRAINT name ] CHECK constraint [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ] |
Définition de contrainte de table :
[ CONSTRAINT name ] { PRIMARY KEY ( column, ... ) | FOREIGN KEY constraint | UNIQUE constraint | CHECK constraint } [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ] |
Définition de contrainte de colonne :
[ CONSTRAINT name ] { NOT NULL | PRIMARY KEY | FOREIGN KEY constraint | UNIQUE | CHECK constraint } [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ] |
Une définition CONSTRAINT peut contenir une clause attribut ajournement et/ou une clause mode contrainte initiale, dans n'importe quel ordre.
indique que la contrainte doit être vérifiée sur la violation de cette règle après l'exécution de chaque clause SQL.
indique que la vérification de la contrainte peut être différée à plus tard, mais pas plus tard que la fin de la transaction en cours.
Le mode contrainte pour chaque contrainte a toujours une valeur initiale par défaut qui est placée pour cette contrainte au début de la transaction.
indique que, comme au démarrage de la transaction, la contrainte doit être vérifiée sur la violation de cette règle après l'exécution de chaque clause SQL.
indique que, comme au démarrage de la transaction, la vérification de la contrainte peut être différée à plus tard, mais pas plus tard que la fin de la transaction en cours.
SQL92 spécifie certaines possibilités additionnelles pour CHECK dans les contraintes de table ou de colonne.
définition d'une contrainte de table :
[ CONSTRAINT name ] CHECK ( VALUE condition ) [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ] |
définition d'une contrainte de colonne :
[ CONSTRAINT name ] CHECK ( VALUE condition ) [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ] |
SQL92 spécifie des possibilités supplémentaires pour PRIMARY KEY :
définition d'une contrainte de table :
[ CONSTRAINT name ] PRIMARY KEY ( column [, ...] ) [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ] |
définition d'une contrainte de colonne :
[ CONSTRAINT name ] PRIMARY KEY [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ] |