CREATE TABLE

Nom

CREATE TABLE — Crée une nouvelle table
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 [, ...] ) ]
  

Entrées

TEMPORARY

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.

table

Nom de la nouvelle table a créer.

column

nom d'une colonne.

type

type de la colonne. Ceci peut inclure des spécificateurs de tableaux. Voir les types et les tableaux pour plus d'information.

DEFAULT value

Valeur par défaut pour une colonne. Voir la clause DEFAULT pour plus d'information.

column_constraint_clause

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.

table_constraint_clause

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.

INHERITS inherited_table

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.

NoteAside
 

héritage et fonctions suivent les conventions du Common Lisp Object System (CLOS).

Sorties

CREATE

message retourné si la table a été créée correctement.

ERROR

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.

ERROR: DEFAULT: type mismatched

si le type de la valeur par défaut ne s'apparie pas avec le type de la colonne définition.

Description

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 Clause

DEFAULT value
   

Entrées

value

les valeurs possibles pour l'expression default value sont :

  • une valeur litérale

  • une fonction utilisateur

  • une fonction sans paramètres

Sorties

Aucune.

Description

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:

niladic USER

CURRENT_USER / USER

Voir la fonction CURRENT_USER

SESSION_USER

pas encore supporté

SYSTEM_USER

pas encore supporté

niladic datetime

CURRENT_DATE

Voir la fonction CURRENT_DATE

CURRENT_TIME

Voir la fonction CURRENT_TIME

CURRENT_TIMESTAMP

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.

Utilisation

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'
);
    

Clause column CONSTRAINT

[ CONSTRAINT name ] { [
    NULL | NOT NULL ] | UNIQUE | PRIMARY KEY | CHECK constraint } [, ...]
   

Entrées

name

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.

NULL

colonne qui contient les valeurs NULL. C'est la cas par défaut.

NOT NULL

colonne qui ne peut contenir les valeurs NULL. équivalent à la contrainte CHECK (column NOT NULL).

UNIQUE

la colonne doit avoir des valeurs uniques. Dans Postgres, ceci est renforcé par une création implicite d'un index unique sur la table.

PRIMARY KEY

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.

constraint

définition d'une contrainte.

Description

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

Note

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.

Contrainte NOT NULL

[ 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.

Sorties

status

ERROR: ExecAppend: Fail to add null value in not null attribute "column".

cette erreur survient au lancement lors de la tentative d'insertion d'une valeur null dans une colonne qui a une contrainte NOT NULL.

Description

Utilisation

Définit deux contraintes de colonne NOT NULL sur la table distributors, une d'elle étant une contrainte nommée :
CREATE TABLE distributors (
    did      DECIMAL(3) CONSTRAINT no_null NOT NULL,
    name     VARCHAR(40) NOT NULL
);
     

Contrainte UNIQUE

[ CONSTRAINT name ] UNIQUE
   

Entrées

CONSTRAINT name

Un label arbitraire donné à une contrainte.

Sorties

status

ERROR: Cannot insert a duplicate key into a unique index.

cette erreur apparaît au lancement lors de la tentative d'insertion d' une valeur dupliquée dans une colonne.

Description

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.

Note

Postgres crée automatiquement un index unique pour chaque contrainte UNIQUE, pour assurer l'intégrité des données.

Utilisation

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
);
  
qui est équivalente à la suivante spécifiée comme contrainte de table :
CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40),
    UNIQUE(name)
);
     

Contrainte CHECK

[ CONSTRAINT name ] CHECK
    ( condition [, ...] ) 
   

Entrées

name

nom arbitraire donné à une contrainte.

condition

n'importe quelle expression conditionnelle valide évaluant un résultat booléen.

Sorties

status

ERROR: ExecAppend: rejected due to CHECK constraint "table_column".

erreur apparaîssant lors de la tentative d'insertion d'une valeur illégale dans une colonne sujet d'une contrainte CKECK.

Description

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.

Contrainte PRIMARY KEY

[ CONSTRAINT name ] PRIMARY KEY 
   

Entrées

CONSTRAINT name

nom arbitraire pour la contrainte.

Sorties

ERROR: Cannot insert a duplicate key into a unique index.

apparaît au lancement lors de la tentative d'insertion d'une valeur dupliquée dans une colonne sujet d'une contrainte PRIMARY KEY.

Description

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.

Notes

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à.

Clause Table CONSTRAINT

[ CONSTRAINT name ] { PRIMARY KEY |  UNIQUE } ( column [, ...] )
[ CONSTRAINT name ] CHECK ( constraint )
   

Entrées

CONSTRAINT name

nom arbitraire donné à une contrainte d'intégrité.

column [, ...]

Le(s) nom de colonne pour laquelle définir un index unique et, pour PRIMARY KEY, une contrainte NOT NULL.

CHECK ( constraint )

expression booléenne a évaluer comme contrainte.

Sorties

Les sorties possibles pour la clause constrainte de table sont les mêmes que pour les portions correspondantes de la clause constrainte de colonne.

Description

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

Note

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.

Contrainte UNIQUE

[ CONSTRAINT name ] UNIQUE ( column [, ...] )
    

Entrées

CONSTRAINT name

nom arbitaire donné à la contrainte.

column

nom d'une colonne dans une table.

Sorties

status

ERROR: Cannot insert a duplicate key into a unique index

erreur qui apparaît au lancement lors de la tentative d'insertion d'une valeur dupliquée dans une colonne.

Description

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.

Utilisation

Définit une contrainte de table UNIQUE pour la table distributors :
CREATE TABLE distributors (
    did      DECIMAL(03),
    name     VARCHAR(40),
    UNIQUE(name)
);
     

Contrainte PRIMARY KEY

[ CONSTRAINT name ] PRIMARY KEY ( column [, ...] ) 
    

Entrées

CONSTRAINT name

nom arbitraire pour la contrainte.

column [, ...]

nom d'une ou plusieurs colonnes dans la table.

Sorties

status

ERROR: Cannot insert a duplicate key into a unique index.

apparaît au lancement lors de la tentative d'insertion d'une valeur dupliquée dans une colonne sujet d'une contrainte PRIMARY KEY.

Description

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.

Utilisation

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)
);
   

Notes

CREATE TABLE/INHERITS est une extension du langage Postgres.

Compatibilité

SQL92

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;
    

Clause UNIQUE

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 ]
     

Clause NULL

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 
     

Clause NOT NULL

SQL92 spécifie certaines possibilités supplémentaires pour NOT NULL :
[ CONSTRAINT name ] NOT NULL 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

Clause CONSTRAINT

SQL92 spécifie certaines possibilités additionnelles pour les contraintes, et définit également des assertions et des contraintes de domaine.

Note

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.

NOT DEFERRABLE

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.

DEFERRABLE

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.

INITIALLY IMMEDIATE

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.

INITIALLY DEFERRED

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.

CHECK clause

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 ]
    

Clause PRIMARY KEY

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 ]