Section courante

A propos

Section administrative du site

CREATE TABLE

Crée une table
PostgreSQL

Syntaxe

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name ( [
{ column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]
| table_constraint
| LIKE source_table [ like_option ... ] }
[, ... ]
] )
[ INHERITS ( parent_table [, ... ] ) ]
[ PARTITION BY { RANGE | LIST } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name
OF type_name [ (
{ column_name [ WITH OPTIONS ] [ column_constraint [ ... ] ]
| table_constraint }
[, ... ]
) ]
[ PARTITION BY { RANGE | LIST } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name
PARTITION OF parent_table [ (
{ column_name [ WITH OPTIONS ] [ column_constraint [ ... ] ]
| table_constraint }
[, ... ]
) ] FOR VALUES partition_bound_spec
[ PARTITION BY { RANGE | LIST } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]

column_constraint est :

[ CONSTRAINT constraint_name ]
{ NOT NULL |
NULL |
CHECK ( expression ) [ NO INHERIT ] |
DEFAULT default_expr |
GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ] |
UNIQUE index_parameters |
PRIMARY KEY index_parameters |
REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
[ ON DELETE action ] [ ON UPDATE action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

et table_constraint est :

[ CONSTRAINT constraint_name ]
{ CHECK ( expression ) [ NO INHERIT ] |
UNIQUE ( column_name [, ... ] ) index_parameters |
PRIMARY KEY ( column_name [, ... ] ) index_parameters |
EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ] |
FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
[ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

et like_option est :

{ INCLUDING | EXCLUDING } { COMMENTS | CONSTRAINTS | DEFAULTS | IDENTITY | INDEXES | STATISTICS | STORAGE | ALL }

et partition_bound_spec est :

IN ( { numeric_literal | string_literal | TRUE | FALSE | NULL } [, ...] ) |
FROM ( { numeric_literal | string_literal | TRUE | FALSE | MINVALUE | MAXVALUE } [, ...] )
TO ( { numeric_literal | string_literal | TRUE | FALSE | MINVALUE | MAXVALUE } [, ...] )

index_parameters dans les contraintes UNIQUE, PRIMARY KEY et EXCLUDE sont :

[ WITH ( storage_parameter [= value] [, ... ] ) ]
[ USING INDEX TABLESPACE tablespace_name ]

exclude_element dans une contrainte EXCLUDE est :

{ column_name | ( expression ) } [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]

Paramètres

Nom Description
TEMP Ce paramètre permet d'indiquer une table temporaire. Si spécifié, la table est créée en tant que table temporaire. Les tables temporaires sont automatiquement supprimées à la fin d'une session, ou éventuellement à la fin de la transaction en cours. Les tables permanentes existantes portant le même nom ne sont pas visibles pour la session en cours tant que la table temporaire existe, sauf si elles sont référencées avec des noms qualifiés de schéma. Tous les index créés sur une table temporaire sont également automatiquement temporaires. Le service autovacuum ne peut pas accéder et ne peut donc pas aspirer ou analyser les tables temporaires. Pour cette raison, les opérations de vide et d'analyse appropriées doivent être effectuées via des commandes SQL de session. Par exemple, si une table temporaire doit être utilisée dans des requêtes complexes, il est sage d'exécuter ANALYZE sur la table temporaire une fois qu'elle est remplie. Facultativement, GLOBAL ou LOCAL peut être écrit avant TEMPORARY ou TEMP. Cela ne fait actuellement aucune différence dans PostgreSQL et est obsolète.
TEMPORARY Ce paramètre permet d'indiquer une table temporaire. Si spécifié, la table est créée en tant que table temporaire. Les tables temporaires sont automatiquement supprimées à la fin d'une session, ou éventuellement à la fin de la transaction en cours. Les tables permanentes existantes portant le même nom ne sont pas visibles pour la session en cours tant que la table temporaire existe, sauf si elles sont référencées avec des noms qualifiés de schéma. Tous les index créés sur une table temporaire sont également automatiquement temporaires. Le service autovacuum ne peut pas accéder et ne peut donc pas aspirer ou analyser les tables temporaires. Pour cette raison, les opérations de vide et d'analyse appropriées doivent être effectuées via des commandes SQL de session. Par exemple, si une table temporaire doit être utilisée dans des requêtes complexes, il est sage d'exécuter ANALYZE sur la table temporaire une fois qu'elle est remplie. Facultativement, GLOBAL ou LOCAL peut être écrit avant TEMPORARY ou TEMP. Cela ne fait actuellement aucune différence dans PostgreSQL et est obsolète.
UNLOGGED Ce paramètre permet d'indiquer, si spécifié, la table est créée en tant que table non journalisée. Les données écrites dans les tables non enregistrées ne sont pas écrites dans le journal d'écriture anticipée, ce qui les rend considérablement plus rapides que les tables ordinaires. Cependant, ils ne sont pas protégés contre les pannes : une table non journalisée est automatiquement tronquée après une panne ou un arrêt incorrect. Le contenu d'une table non journalisée n'est pas non plus répliqué sur les serveurs de secours. Tous les index créés sur une table non journalisée sont également automatiquement déconnectés.
IF NOT EXISTS Ce paramètre permet d'indiquer s'il n'existe pas. Ne renvoie pas d'erreur si une relation du même nom existe déjà. Un avis est émis dans ce cas. Notez qu'il n'y a aucune garantie que la relation existante ressemble à celle ayant été créée.
table_name Ce paramètre permet d'indiquer le nom (éventuellement qualifié par le schéma) de la table à créer.
OF type_name Ce paramètre permet de créer une table typée, prenant sa structure à partir du type composite spécifié (nom éventuellement qualifié de schéma). Une table typée est liée à son type ; par exemple la table sera supprimée si le type est supprimé (avec DROP TYPE ... CASCADE). Lorsqu'une table typée est créée, les types de données des colonnes sont déterminés par le type composite sous-jacent et ne sont pas spécifiés par la commande CREATE TABLE. Mais la commande CREATE TABLE peut ajouter des valeurs par défaut et des contraintes à la table et peut spécifier des paramètres d'entreposage.
PARTITION OF parent_table FOR VALUES partition_bound_spec Ce paramètre permet de créer la table en tant que partition de la table parent spécifiée. La partition_bound_spec doit correspondre à la méthode de partitionnement et à la clef de partition de la table parent, et ne doit pas chevaucher une partition existante de ce parent. La forme avec IN est utilisée pour le partitionnement de liste, tandis que la forme avec FROM et TO est utilisée pour le partitionnement par intervalle. Chacune des valeurs spécifiées dans partition_bound_spec est un littéral, NULL, MINVALUE ou MAXVALUE. Chaque valeur littérale doit être soit une constante numérique qui est coercitive au type de colonne de clé de partition correspondante, soit un littéral de chaîne de caractères étant une entrée valide pour ce type. Lors de la création d'une partition de liste, NULL peut être spécifié pour signifier que la partition permet à la colonne de clé de partition d'être nulle. Cependant, il ne peut pas y avoir plus d'une telle partition de liste pour une table parente donnée. NULL ne peut pas être spécifié pour les partitions de l'intervalle. Lors de la création d'une partition d'intervalle, la limite inférieure spécifiée avec FROM est une limite inclusive, tandis que la limite supérieure spécifiée avec TO est une limite exclusive. C'est-à-dire que les valeurs spécifiées dans la liste FROM sont des valeurs valides des colonnes de clef de partition correspondantes pour cette partition, alors que celles de la liste TO ne le sont pas. Notez que cette déclaration doit être comprise selon les règles de comparaison par ligne. Par exemple, étant donné PARTITION BY RANGE (x,y), une partition bornée FROM (1, 2) TO (3, 4) autorise x=1 avec n'importe quel y>=2, x=2 avec n'importe quel y non nul, et x=3 avec n'importe quel y<4. Les valeurs spéciales MINVALUE et MAXVALUE peuvent être utilisées lors de la création d'une partition d'intervalle pour indiquer qu'il n'y a pas de limite inférieure ou supérieure sur la valeur de la colonne. Par exemple, une partition définie à l'aide de FROM (MINVALUE) TO (10) autorise toutes les valeurs inférieures à 10, et une partition définie à l'aide de FROM (10) TO (MAXVALUE) autorise toutes les valeurs supérieures ou égales à 10. Lors de la création d'une partition de plage impliquant plusieurs colonnes, il peut également être judicieux d'utiliser MAXVALUE dans le cadre de la limite inférieure et MINVALUE dans le cadre de la limite supérieure. Par exemple, une partition définie à l'aide de FROM (0, MAXVALUE) TO (10, MAXVALUE) autorise toutes les lignes où la première colonne de clef de partition est supérieure à 0 et inférieure ou égale à 10. De même, une partition définie à l'aide de FROM ('a ', MINVALUE) TO ('b', MINVALUE) autorise toutes les lignes où la première colonne de clef de partition commence par "a". Notez que si MINVALUE ou MAXVALUE est utilisé pour une colonne d'une limite de partitionnement, la même valeur doit être utilisée pour toutes les colonnes suivantes. Par exemple, (10, MINVALUE, 0) n'est pas une limite valide ; vous devez écrire (10, MINVALUE, MINVALUE). Notez également que certains types d'éléments, tels que l'horodatage, ont une notion "d'infini", n'étant qu'une autre valeur pouvant être entreposée. Ceci est différent de MINVALUE et MAXVALUE, qui ne sont pas des valeurs réelles pouvant être entreposées, mais plutôt des manières de dire que la valeur est illimitée. MAXVALUE peut être considéré comme étant supérieur à toute autre valeur, y compris «l'infini» et MINVALUE comme étant inférieur à toute autre valeur, y compris «moins l'infini». Ainsi, l'intervalle FROM ('infinity') TO (MAXVALUE) n'est pas une intervalle vide ; il permet précisément d'entreposer une valeur - "l'infini". Une partition doit avoir les mêmes noms et types de colonnes que la table partitionnée à laquelle elle appartient. Si le parent est spécifié WITH OIDS alors toutes les partitions doivent avoir des OID ; la colonne OID du parent sera héritée par toutes les partitions comme n'importe quelle autre colonne. Les modifications apportées aux noms de colonnes ou aux types d'une table partitionnée, ou l'ajout ou la suppression d'une colonne OID, se propageront automatiquement à toutes les partitions. Les contraintes CHECK seront héritées automatiquement par chaque partition, mais une partition individuelle peut spécifier des contraintes CHECK supplémentaires ; des contraintes supplémentaires avec le même nom et la même condition que dans le parent seront fusionnées avec la contrainte parent. Les valeurs par défaut peuvent être spécifiées séparément pour chaque partition. Mais notez que la valeur par défaut d'une partition n'est pas appliquée lors de l'insertion d'un tuple via une table partitionnée. Les lignes insérées dans une table partitionnée seront automatiquement acheminées vers la bonne partition. Si aucune partition appropriée n'existe, une erreur se produira. De plus, si la mise à jour d'une ligne dans une partition donnée l'obligeait à se déplacer vers une autre partition en raison de nouvelles valeurs de clef de partition, une erreur se produira. Les opérations telles que TRUNCATE affectant normalement une table et tous ses enfants d'héritage se répercuteront sur toutes les partitions, mais peuvent également être effectuées sur une partition individuelle. Notez que supprimer une partition avec DROP TABLE nécessite de prendre un verrou ACCESS EXCLUSIVE sur la table parent.
column_name Ce paramètre permet d'indiquer le nom d'une colonne à créer dans la nouvelle table.
data_type Ce paramètre permet d'indiquer le type de données de la colonne. Cela peut inclure des spécificateurs de tableau.
COLLATE collation Ce paramètre permet d'indiquer un classement à la colonne (devant être d'un type de données pouvant être classé). S'il n'est pas spécifié, le classement par défaut du type de données de colonne est utilisé.
INHERITS ( parent_table [, ... ] ) Ce paramètre permet d'indiquer une liste de tables dont la nouvelle table hérite automatiquement de toutes les colonnes. Les tables parents peuvent être des tables simples ou des tables étrangères. L'utilisation de INHERITS crée une relation persistante entre la nouvelle table enfant et sa ou ses table(s) parent(s). Les modifications de schéma apportées au(x) parent(s) se propagent normalement également aux enfants et, par défaut, les données de la table enfant sont incluses dans les analyses du ou des parents. Si le même nom de colonne existe dans plusieurs tables parent, une erreur est signalée à moins que les types de données des colonnes correspondent dans chacune des tables parent. S'il n'y a pas de conflit, les colonnes en double sont fusionnées pour former une seule colonne dans la nouvelle table. Si la liste des noms de colonnes de la nouvelle table contient un nom de colonne également hérité, le type de données doit également correspondre à la ou aux colonnes héritées et les définitions de colonnes sont fusionnées en une seule. Si la nouvelle table spécifie explicitement une valeur par défaut pour la colonne, cette valeur par défaut remplace toutes les valeurs par défaut des déclarations héritées de la colonne. Sinon, tous les parents spécifiant des valeurs par défaut pour la colonne doivent tous spécifier la même valeur par défaut, sinon une erreur sera signalée. Les contraintes CHECK sont fusionnées essentiellement de la même manière que les colonnes : si plusieurs tables parents et/ou la nouvelle définition de table contiennent des contraintes CHECK portant le même nom, ces contraintes doivent toutes avoir la même expression de contrôle, sinon une erreur sera signalée. Les contraintes ayant le même nom et la même expression seront fusionnées en une seule copie. Une contrainte marquée NO INHERIT dans un parent ne sera pas prise en compte. Notez qu'une contrainte CHECK sans nom dans la nouvelle table ne sera jamais fusionnée, car un nom unique sera toujours choisi pour elle. Les paramètres de STORAGE des colonnes sont également copiés à partir des tables parent. Si une colonne de la table parente est une colonne d'identité, cette propriété n'est pas héritée. Une colonne de la table enfant peut être déclarée colonne d'identité si vous le souhaitez.
PARTITION BY { RANGE | LIST } ( { column_name | ( expression ) } [ opclass ] [, ...] ) Ce paramètre permet d'indiquer une stratégie de partitionnement de la table. La table ainsi créée est appelée table partitionnée. La liste de colonnes ou d'expressions entre parenthèses forme la clef de partition de la table. Lors de l'utilisation du partitionnement par plage, la clef de partition peut inclure plusieurs colonnes ou expressions (jusqu'à 32, mais cette limite peut être modifiée lors de la création de PostgreSQL), mais pour le partitionnement de liste, la clef de partition doit consister en une seule colonne ou expression. Si aucune classe d'opérateur B-tree n'est spécifiée lors de la création d'une table partitionnée, la classe d'opérateur B-tree par défaut pour le type de données sera utilisée. S'il n'y en a pas, une erreur sera signalée. Une table partitionnée est divisée en sous-tables (appelées partitions), étant créées à l'aide de commandes CREATE TABLE distinctes. La table partitionnée est elle-même vide. Une ligne de données insérée dans la table est acheminée vers une partition en fonction de la valeur des colonnes ou des expressions dans la clef de partition. Si aucune partition existante ne correspond aux valeurs de la nouvelle ligne, une erreur sera signalée. Les tables partitionnées ne prennent pas en charge les contraintes UNIQUE, PRIMARY KEY, EXCLUDE ou FOREIGN KEY ; cependant, vous pouvez définir ces contraintes sur des partitions individuelles.
LIKE source_table [ like_option ... ] Ce paramètre permet d'indiquer une table à partir de laquelle la nouvelle table copie automatiquement tous les noms de colonnes, leurs types de données et leurs contraintes non nulles. Contrairement à INHERITS, la nouvelle table et la table d'origine sont complètement découplées une fois la création terminée. Les modifications apportées à la table d'origine ne seront pas appliquées à la nouvelle table et il n'est pas possible d'inclure les données de la nouvelle table dans les analyses de la table d'origine. Les expressions par défaut des définitions de colonnes copiées ne seront copiées que si INCLUDING DEFAULTS est spécifié. Le comportement par défaut consiste à exclure les expressions par défaut, ce qui fait que les colonnes copiées dans la nouvelle table ont des valeurs par défaut nulles. Notez que la copie des valeurs par défaut appelant des fonctions de modification de base de données, telles que nextval, peut créer un lien fonctionnel entre les tables d'origine et les nouvelles tables. Toutes les spécifications d'identité des définitions de colonnes copiées ne seront copiées que si INCLUDING IDENTITY est spécifié. Une nouvelle séquence est créée pour chaque colonne d'identité de la nouvelle table, distincte des séquences associées à l'ancienne table. Les contraintes non nulles sont toujours copiées dans la nouvelle table. Les contraintes CHECK ne seront copiées que si INCLUDING CONSTRAINTS est spécifié. Aucune distinction n'est faite entre les contraintes de colonne et les contraintes de table. Les statistiques étendues sont copiées dans la nouvelle table si INCLUDING STATISTICS est spécifié. Les index, les contraintes PRIMARY KEY, UNIQUE et EXCLUDE sur la table d'origine seront créés sur la nouvelle table uniquement si INCLUDING INDEXES est spécifié. Les noms des nouveaux index et contraintes sont choisis selon les règles par défaut, quelle que soit la manière dont les originaux ont été nommés. (Ce comportement évite d'éventuels échecs de noms en double pour les nouveaux index.) Les paramètres STORAGE pour les définitions de colonne copiées ne seront copiés que si INCLUDING STORAGE est spécifié. Le comportement par défaut consiste à exclure les paramètres de STORAGE, ce qui fait que les colonnes copiées dans la nouvelle table ont des paramètres par défaut spécifiques au type. Les commentaires pour les colonnes, les contraintes et les index copiés ne seront copiés que si INCLUDING COMMENTS est spécifié. Le comportement par défaut consiste à exclure les commentaires, ce qui fait que les colonnes et les contraintes copiées dans la nouvelle table n'ont aucun commentaire. INCLUDING ALL est une forme abrégée de INCLUDING COMMENTS, INCLUDING CONSTRAINTS, INCLUDING DEFAULTS, INCLUDING IDENTITY INCLUDING INDEXES, INCLUDING STATISTICS, INCLUDING STORAGE. Notez que contrairement à INHERITS, les colonnes et les contraintes copiées par LIKE ne sont pas fusionnées avec des colonnes et des contraintes de même nom. Si le même nom est spécifié explicitement ou dans une autre clause LIKE, une erreur est signalée. La clause LIKE peut également être utilisée pour copier des définitions de colonnes à partir de vues, de tables étrangères ou de types composites. Les options inapplicables (par exemple, INCLUDING INDEXES à partir d'une vue) sont ignorées.
CONSTRAINT constraint_name Ce paramètre permet d'indiquer un nom facultatif pour une contrainte de colonne ou de table. Si la contrainte est violée, le nom de la contrainte est présent dans les messages d'erreur, donc les noms de contrainte comme col doit être positif peuvent être utilisés pour communiquer des informations de contrainte utiles aux applications clientes. (Les guillemets doubles sont nécessaires pour spécifier les noms de contraintes contenant des espaces.) Si aucun nom de contrainte n'est spécifié, le système génère un nom.
NOT NULL Ce paramètre permet d'indiquer que la colonne n'est pas autorisée à contenir des valeurs nulles.
NULL Ce paramètre permet d'indiquer que la colonne est autorisée à contenir des valeurs nulles. C'est la valeur par défaut. Cette clause n'est fournie qu'à des fins de compatibilité avec les bases de données SQL non standard. Son utilisation est déconseillée dans les nouvelles applications.
CHECK ( expression ) [ NO INHERIT ] Ce paramètre permet d'indiquer une expression produisant un résultat booléen auquel les lignes nouvelles ou mises à jour doivent satisfaire pour qu'une opération d'insertion ou de mise à jour réussisse. Les expressions évaluées à TRUE ou UNKNOWN réussissent. Si une ligne d'une opération d'insertion ou de mise à jour produit un résultat FALSE, une exception d'erreur est déclenchée et l'insertion ou la mise à jour n'altère pas la base de données. Une contrainte de vérification spécifiée en tant que contrainte de colonne doit référencer uniquement la valeur de cette colonne, tandis qu'une expression apparaissant dans une contrainte de table peut référencer plusieurs colonnes. Actuellement, les expressions CHECK ne peuvent pas contenir de sous-requêtes ni faire référence à des variables autres que les colonnes de la ligne courante. Le tableoid de la colonne système peut être référencé, mais pas n'importe quelle autre colonne système. Une contrainte marquée NO INHERIT ne se propagera pas aux tables enfants. Lorsqu'une table a plusieurs contraintes CHECK, elles seront testées pour chaque ligne par ordre alphabétique de nom, après avoir vérifié les contraintes NOT NULL. (Les versions de PostgreSQL antérieures à la 9.5 n'honoraient aucun ordre de déclenchement particulier pour les contraintes CHECK.)
DEFAULT default_expr Ce paramètre permet d'attribuer une valeur de données par défaut à la colonne dont la définition de colonne apparaît. La valeur est toute expression sans variable (les sous-requêtes et les références croisées à d'autres colonnes de la table actuelle ne sont pas autorisées). Le type de données de l'expression par défaut doit correspondre au type de données de la colonne. L'expression par défaut sera utilisée dans toute opération d'insertion ne spécifiant pas de valeur pour la colonne. S'il n'y a pas de valeur par défaut pour une colonne, la valeur par défaut est null.
GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ] Ce paramètre permet de créer la colonne en tant que colonne d'identité. Il aura une séquence implicite lui étant attachée et la colonne dans les nouvelles lignes aura automatiquement les valeurs de la séquence lui étant attribuée. Une telle colonne est implicitement NON NULL. Les clauses ALWAYS et BY DEFAULT déterminent comment la valeur de séquence est prioritaire sur une valeur spécifiée par l'utilisateur dans une instruction INSERT. Si ALWAYS est spécifié, une valeur spécifiée par l'utilisateur n'est acceptée que si l'instruction INSERT spécifie OVERRIDING SYSTEM VALUE. Si BY DEFAULT est spécifié, la valeur spécifiée par l'utilisateur est prioritaire. (Dans la commande COPY, les valeurs spécifiées par l'utilisateur sont toujours utilisées quel que soit ce paramètre.) La clause optionnelle sequence_options peut être utilisée pour remplacer les options de la séquence.
UNIQUE (column constraint)
UNIQUE ( column_name [, ... ] ) (table constraint)
Ce paramètre permet d'indiquer qu'un groupe d'une ou plusieurs colonnes d'une table ne peut contenir que des valeurs uniques. Le comportement d'une contrainte de table unique est le même que celui d'une contrainte de colonne unique, avec la possibilité supplémentaire de s'étendre sur plusieurs colonnes. La contrainte impose donc que deux lignes quelconques doivent différer dans au moins une de ces colonnes. Aux fins d'une contrainte d'unicité, les valeurs nulles ne sont pas considérées comme égales. Chaque contrainte d'unicité doit nommer un ensemble de colonnes différent de l'ensemble de colonnes nommé par toute autre contrainte de clef unique ou primaire définie pour la table. (Sinon, les contraintes uniques redondantes seront ignorées.)
PRIMARY KEY (column constraint)
PRIMARY KEY ( column_name [, ... ] ) (table constraint)
Ce paramètre permet d'indiquer qu'une ou plusieurs colonnes d'une table ne peuvent contenir que des valeurs uniques (non en double) et non nulles. Une seule clef primaire peut être spécifiée pour une table, qu'il s'agisse d'une contrainte de colonne ou d'une contrainte de table. La contrainte de clef primaire doit nommer un ensemble de colonnes différent de l'ensemble de colonnes nommé par toute contrainte unique définie pour la même table. (Sinon, la contrainte d'unicité est redondante et sera ignorée.) Le PRIMARY KEY applique les mêmes contraintes de données qu'une combinaison de UNIQUE et NOT NULL. Cependant, l'identification d'un ensemble de colonnes en tant que clef primaire fournit également des métadonnées sur la conception du schéma, car une clef primaire implique que d'autres tables peuvent s'appuyer sur cet ensemble de colonnes comme identifiant unique pour les lignes. L'ajout d'une contrainte PRIMARY KEY créera automatiquement un index btree unique sur la colonne ou le groupe de colonnes utilisé dans la contrainte.
EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ] Ce paramètre permet de définir une contrainte d'exclusion, garantissant que si deux lignes sont comparées sur la ou les colonnes ou expressions spécifiées à l'aide des opérateurs spécifiés, toutes ces comparaisons ne retourneront pas TRUE. Si tous les opérateurs spécifiés testent l'égalité, cela équivaut à une contrainte UNIQUE, bien qu'une contrainte unique ordinaire soit plus rapide. Cependant, les contraintes d'exclusion peuvent spécifier des contraintes plus générales que la simple égalité. Par exemple, vous pouvez spécifier une contrainte selon laquelle deux lignes du tableau ne contiennent pas de cercles superposés en utilisant l'opérateur &&. Les contraintes d'exclusion sont implémentées à l'aide d'un index, donc chaque opérateur spécifié doit être associé à une classe d'opérateur appropriée pour la méthode d'accès à l'index index_method. Les opérateurs doivent être commutatifs. Chaque exclude_element peut éventuellement spécifier une classe d'opérateurs et/ou des options de classement. La méthode d'accès doit prendre en charge amgettuple; à l'heure actuelle, cela signifie que GIN ne peut pas être utilisé. Bien que cela soit autorisé, il est inutile d'utiliser des index B-tree ou de hachage avec une contrainte d'exclusion, car cela ne fait rien qu'une contrainte unique ordinaire ne fasse mieux. Ainsi, en pratique, la méthode d'accès sera toujours GiST ou SP-GiST. Le prédicat permet de spécifier une contrainte d'exclusion sur un sous-ensemble de la table ; en interne, cela crée un index partiel. Notez que les parenthèses sont nécessaires autour du prédicat.
REFERENCES reftable [ ( refcolumn ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (column constraint) FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (table constraint) Ce paramètre permet d'indiquer une contrainte de clef étrangère, exigeant qu'un groupe d'une ou plusieurs colonnes de la nouvelle table ne contienne que des valeurs correspondant aux valeurs de la ou des colonnes référencées d'une ligne de la table référencée. Si la liste refcolumn est omise, la clef primaire de la reftable est utilisée. Les colonnes référencées doivent être les colonnes d'une contrainte de clef unique ou primaire non reportable dans la table référencée. L'utilisateur doit avoir l'autorisation REFERENCES sur la table référencée (soit la table entière, soit les colonnes référencées spécifiques). Notez que les contraintes de clef étrangère ne peuvent pas être définies entre les tables temporaires et les tables permanentes. Une valeur insérée dans la ou les colonnes de référence est comparée aux valeurs de la table référencée et des colonnes référencées à l'aide du type de correspondance donné. Il existe trois types de correspondance : MATCH FULL, MATCH PARTIAL et MATCH SIMPLE (étant la valeur par défaut). MATCH FULL ne permettra pas qu'une colonne d'une clé étrangère multicolonne soit nulle à moins que toutes les colonnes de clef étrangère ne soient nulles ; s'ils sont tous nuls, il n'est pas nécessaire que la ligne ait une correspondance dans la table référencée. Le MATCH SIMPLE permet à n'importe quelle colonne de clef étrangère d'être nulle ; si l'un d'entre eux est nul, la ligne n'a pas besoin d'avoir une correspondance dans la table référencée. Le MATCH PARTIAL n'est pas encore implémenté. (Bien sûr, des contraintes NOT NULL peuvent être appliquées à la ou aux colonnes de référencement pour éviter que ces cas ne se produisent.) De plus, lorsque les données des colonnes référencées sont modifiées, certaines actions sont effectuées sur les données des colonnes de cette table. La clause ON DELETE spécifie l'action à effectuer lorsqu'une ligne référencée dans la table référencée est supprimée. De même, la clause ON UPDATE spécifie l'action à effectuer lorsqu'une colonne référencée dans la table référencée est mise à jour avec une nouvelle valeur. Si la ligne est mise à jour, mais que la colonne référencée n'est pas réellement modifiée, aucune action n'est effectuée. Les actions référentielles autres que le contrôle NO ACTION ne peuvent pas être différées, même si la contrainte est déclarée différée. Les actions suivantes sont possibles pour chaque clause :
Action Description
NO ACTION Cette action permet de produire une erreur indiquant que la suppression ou la mise à jour créerait une violation de contrainte de clef étrangère. Si la contrainte est différée, cette erreur sera produite au moment de la vérification de la contrainte s'il existe encore des lignes de référencement. Il s'agit de l'action par défaut.
RESTRICT Cette action permet de produire une erreur indiquant que la suppression ou la mise à jour créerait une violation de contrainte de clef étrangère. C'est la même chose que NO ACTION sauf que la vérification n'est pas reportable.
CASCADE Cette action permet de supprimer toutes les lignes référençant la ligne supprimée ou mettez à jour les valeurs de la ou des colonnes de référence avec les nouvelles valeurs des colonnes référencées, respectivement.
SET NULL Cette action permet de définir la ou les colonnes de référence sur null.
SET DEFAULT Cette action permet de définir la ou les colonnes de référencement sur leurs valeurs par défaut. (Il doit y avoir une ligne dans la table référencée correspondant aux valeurs par défaut, si elles ne sont pas nulles, sinon l'opération échouera.)
Si la ou les colonnes référencées sont modifiées fréquemment, il peut être judicieux d'ajouter un index à la ou aux colonnes de référence afin que les actions référentielles associées à la contrainte de clef étrangère puissent être effectuées plus efficacement.
DEFERRABLE
NOT DEFERRABLE
Ce paramètre permet de contrôler si la contrainte peut être différée. Une contrainte n'étant pas reportable sera vérifiée immédiatement après chaque commande. La vérification des contraintes reportables peut être différée jusqu'à la fin de la transaction (à l'aide de la commande SET CONSTRAINTS). NOT DEFERRABLE est la valeur par défaut. Actuellement, seules les contraintes UNIQUE, PRIMARY KEY, EXCLUDE et REFERENCES (clef étrangère) acceptent cette clause. Les contraintes NOT NULL et CHECK ne peuvent pas être différées. Notez que les contraintes reportables ne peuvent pas être utilisées comme arbitres de conflit dans une instruction INSERT qui inclut une clause ON CONFLICT DO UPDATE.
INITIALLY DEFERRED Ce paramètre permet d'indiquer l'heure par défaut pour vérifier la contrainte.
INITIALLY IMMEDIATE Ce paramètre permet de vérifier après chaque instruction. C'est la valeur par défaut. Si la contrainte est INITIALLY DEFERRED, elle n'est vérifiée qu'à la fin de la transaction. Le temps de vérification des contraintes peut être modifié avec la commande SET CONSTRAINTS.
WITH ( storage_parameter [= value] [, ... ] ) Ce paramètre permet d'indiquer les paramètres d'entreposage facultatifs pour une table ou un index. La clause WITH pour une table peut également inclure OIDS=TRUE (ou simplement OIDS) pour spécifier que les lignes de la nouvelle table doivent avoir des OID (identificateurs d'objet) leur étant affectés, ou OIDS=FALSE pour spécifier que les lignes ne doivent pas avoir d'OID. Si OIDS n'est pas spécifié, le paramètre par défaut dépend du paramètre de configuration default_with_oids. (Si la nouvelle table hérite de toutes les tables étant des OID, alors OIDS=TRUE est forcé même si la commande dit OIDS=FALSE.) Si OIDS=FALSE est spécifié ou implicite, la nouvelle table ne stocke pas les OID et aucun OID ne sera attribué pour une ligne insérée dans celle-ci. Ceci est généralement considéré comme intéressant, car cela réduira la consommation d'OID et retardera ainsi le bouclage du compteur OID 32 bits. Une fois le compteur bouclé, les OID ne peuvent plus être considérés comme uniques, ce qui les rend considérablement moins utiles. De plus, l'exclusion des OID d'une table réduit l'espace requis pour stocker la table sur le disque de 4 octets par ligne (sur la plupart des machines), améliorant légèrement les performances. Pour supprimer les OID d'une table après sa création, utilisez ALTER TABLE.
WITH OIDS
WITHOUT OIDS
Ce sont des syntaxes obsolètes équivalentes à WITH (OIDS) et WITH (OIDS=FALSE), respectivement. Si vous souhaitez donner à la fois un paramètre OIDS et des paramètres d'entreposage, vous devez utiliser la syntaxe WITH ( ... ).
ON COMMIT Ce paramètre permet d'indiquer le comportement des tables temporaires à la fin d'un bloc de transaction peut être contrôlé à l'aide de ON COMMIT. Les trois options sont :
Option Description
PRESERVE ROWS Cette option permet d'indiquer qu'aucune action particulière n'est prise à la fin des transactions. Ceci est le comportement par défaut.
DELETE ROWS Cette option permet d'indiquer que toutes les lignes de la table temporaire seront supprimées à la fin de chaque bloc de transaction. Essentiellement, un TRUNCATE automatique est effectué à chaque commit. Lorsqu'il est utilisé sur une table partitionnée, il n'est pas répercuté sur ses partitions.
DROP Cette option permet d'indiquer la table temporaire sera supprimée à la fin du bloc de transaction en cours. Lorsqu'elle est utilisée sur une table partitionnée, cette action supprime ses partitions et lorsqu'elle est utilisée sur des tables avec des enfants d'héritage, elle supprime les enfants dépendants.
TABLESPACE tablespace_name Ce paramètre permet d'indiquer le nom du tablespace dans lequel la nouvelle table doit être créée. Si non spécifié, default_tablespace est consulté, ou temp_tablespaces si la table est temporaire.
USING INDEX TABLESPACE tablespace_name Ce paramètre permet de sélectionner le tablespace dans lequel l'index associé à une contrainte UNIQUE, PRIMARY KEY ou EXCLUDE sera créé. Si non spécifié, default_tablespace est consulté, ou temp_tablespaces si la table est temporaire.

Description

Cette instruction permet de définir une nouvelle table.



Dernière mise à jour : Jeudi, le 14 Octobre 2021