PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 17.6 » Référence » Commandes SQL » CREATE FOREIGN TABLE

CREATE FOREIGN TABLE

CREATE FOREIGN TABLE — crĂ©e une nouvelle table distante

Synopsis

CREATE FOREIGN TABLE [ IF NOT EXISTS ] nom_table ( [
  { nom_colonne type_donnee [ OPTIONS ( option 'valeur' [, ... ] ) ] [ COLLATE collation ] [ contrainte_colonne [ ... ] ]
    | contrainte_table }
    [, ... ]
] )
  SERVER nom_serveur
[ OPTIONS ( option 'valeur' [, ... ] ) ]

CREATE FOREIGN TABLE [ IF NOT EXISTS ] nom_table
  PARTITION OF table_parente [ (
  { nom_colonne [ WITH OPTIONS ] [ contrainte_colonne [ ... ] ]
    | contrainte_table }
    [, ... ]
) ]
{ FOR VALUES spec_limites_partition | DEFAULT }
  SERVER nom_serveur
[ OPTIONS ( option 'value' [, ... ] ) ]

where contrainte_colonne is:

[ CONSTRAINT nom_contrainte ]
{ NOT NULL |
  NULL |
  CHECK ( expression ) [ NO INHERIT ] |
  DEFAULT expr_defaut |
  GENERATED ALWAYS AS ( expr_generation ) STORED }

et contrainte_table vaut :

[ CONSTRAINT nom_contrainte ]
CHECK ( expression ) [ NO INHERIT ]

et spec_limites_partition vaut :

IN ( expr_limites_partition [, ...] ) |
FROM ( { expr_limites_partition | MINVALUE | MAXVALUE } [, ...] )
  TO ( { expr_limites_partition | MINVALUE | MAXVALUE } [, ...] ) |
WITH ( MODULUS literal_numeric, REMAINDER literal_numeric )
  

Description

La commande CREATE FOREIGN TABLE crée une nouvelle table distante dans la base de données courante. La table distante appartient à l'utilisateur qui exécute cette commande.

Si un nom de schema est spĂ©cifiĂ© (par exemple, CREATE FOREIGN TABLE monschema.matable ...), alors la table sera créée dans le schĂ©ma spĂ©cifiĂ©. Dans les autres cas, elle sera créée dans le schĂ©ma courant. Le nom de la table distante doit ĂȘtre diffĂ©rent du nom des autres relations (tables, sĂ©quences, index, vues, vues matĂ©rialisĂ©es ou tables distantes) du mĂȘme schĂ©ma.

La commande CREATE FOREIGN TABLE crĂ©e aussi automatiquement un type de donnĂ©e qui reprĂ©sente le type composite correspondant Ă  une ligne de la table distante. En consĂ©quence, une table distante ne peut pas avoir le mĂȘme nom qu'un type de donnĂ©e existant dans le mĂȘme schĂ©ma.

Si la clause PARTITION OF est spécifiée alors la table est crée comme une partition de table_parente avec les limites spécifiées.

Pour pouvoir créer une table distante, vous devez avoir le droit USAGE sur le serveur distant, ainsi que le droit USAGE sur tous les types de colonne utilisés dans la table.

ParamĂštres

IF NOT EXISTS

Permet de ne pas retourner d'erreur si une table distante de mĂȘme nom existe dĂ©jĂ . Une simple notice est alors rapportĂ©e. À noter que la table distante existante n'a potentiellement aucun lien avec la table distante qui aurait pu ĂȘtre créée.

nom_table

Le nom de la table distante à créer. Il est aussi possible de spécifier le schéma qui contient cette table.

nom_colonne

Le nom de la colonne à créer dans cette nouvelle table distante.

type_donnee

le type de donnĂ©e de la colonne. cela peut inclure des spĂ©cificateurs de tableaux. pour plus d'information sur les types de donnĂ©es supportĂ©s par postgresql, se rĂ©fĂ©rer Ă  Chapitre 8.

COLLATE collation

La clause COLLATE affecte un collationnement Ă  la colonne (qui doit ĂȘtre d'un type de donnĂ©es acceptant le collationnement). Si ce n'est pas spĂ©cifiĂ©, le collationnement par dĂ©faut du type de donnĂ©es de la colonne est utilisĂ©.

INHERITS ( table_parent [, ... ] )

La clause optionnelle INHERITS indique une liste de tables à partir desquelles la nouvelle table distante hérite automatiquement de toutes les colonnes. Les tables parents sont des tables simples ou des tables distantes. Voir la forme similaire de CREATE TABLE pour plus de détails. Notez que ceci n'est pas accepté pour créer la table distante en tant que partition de la table parent s'il existe des index UNIQUE sur la table parent. (Voir aussi ALTER TABLE ATTACH PARTITION.)

PARTITION OF table_parent { FOR VALUES spec_limites_partition | DEFAULT }

Cette syntaxe peut ĂȘtre utilisĂ©e pour crĂ©er la table distante en tant que partition de la table parent indiquĂ©e avec les valeurs limites de la partition. Voir la syntaxe similaire de CREATE TABLE pour plus de dĂ©tails.

CONSTRAINT nom_contrainte

Un nom optionnel 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 des noms de contrainte comme col doit ĂȘtre positif peuvent ĂȘtre utilisĂ©s pour communiquer des informations intĂ©ressantes sur les contraintes aux applications clientes. (Les guillemets doubles sont nĂ©cessaires pour indiquer les noms de contraintes qui contiennent des espaces.) Si un nom de contrainte n'est pas indiquĂ©, le systĂšme en gĂ©nĂšre un.

NOT NULL

Interdit des valeurs NULL dans la colonne.

NULL

Les valeurs NULL sont autorisées pour la colonne. il s'agit du comportement par défaut.

Cette clause n'est fournie que pour des raisons de compatibilité avec les bases de données SQL non standard. Son utilisation n'est pas encouragée dans les nouvelles applications.

CHECK ( expression ) [ NO INHERIT ]

La clause CHECK précise une expression produisant un résultat booléen que chaque ligne de la table distante est attendu satisfaire. Autrement dit, l'expression doit renvoyer TRUE ou UNKNOWN, jamais FALSE, pour toutes les lignes de la table distante. Une contrainte de vérification spécifiée comme contrainte de colonne doit seulement référencer la valeur de la colonne alors 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. Elles ne peuvent pas non plus faire rĂ©fĂ©rence Ă  des variables autres que les colonnes de la ligne courante. La colonne systĂšme tableoid peut ĂȘtre rĂ©fĂ©rencĂ©e, mais aucune autre colonne systĂšme ne peut l'ĂȘtre.

Une contrainte marquée avec NO INHERIT ne sera pas propagée aux tables enfants.

DEFAULT expr_defaut

La clause default affecte une valeur par dĂ©faut pour la colonne dont il est l'objet. la valeur est toute expression sans variable (les sous-requĂȘtes et les rĂ©fĂ©rences croisĂ©es Ă  d'autres colonnes de la mĂȘme table ne sont pas autorisĂ©es). le type de donnĂ©es de l'expression doit correspondre au type de donnĂ©es de la colonne.

L'expression par défaut sera utilisée dans toute opération d'insertion qui n'indique 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 implicite est null.

GENERATED ALWAYS AS ( expr_generation ) STORED

Cette clause crée la colonne en tant que colonne générée. La colonne ne peut pas faire l'objet d'une écriture, et quand elle est lue, c'est le résultat de l'expression spécifiée qui est renvoyé.

Le mot-clĂ© STORED est nĂ©cessaire pour indiquer que la colonne va ĂȘtre calculĂ©e au moment de l'Ă©criture. (La valeur calculĂ©e sera prĂ©sentĂ©e au wrapper de donnĂ©es distantes pour stockage et doit ĂȘtre renvoyĂ©e en lecture.)

L'expression de gĂ©nĂ©ration peut se rĂ©fĂ©rer Ă  d'autres colonnes de la table, mais pas Ă  d'autres colonnes gĂ©nĂ©rĂ©es. Toutes les fonctions et opĂ©rateurs qu'elle utilise doivent ĂȘtre immuables. Les rĂ©fĂ©rences Ă  d'autres tables ne sont pas autorisĂ©es.

nom_serveur

Le nom d'un serveur distant existant à utiliser pour la table distante. Pour les détails sur la définition d'un serveur, voir CREATE SERVER.

OPTIONS ( option 'valeur' [, ...] )

Options qui peuvent ĂȘtre associĂ©s Ă  la nouvelle table distante ou Ă  une de ses colonnes. Les noms des options autorisĂ©es et leurs valeurs sont spĂ©cifiques Ă  chaque wrapper de donnĂ©es distantes et sont validĂ©es en utilisant la fonction de validation du wrapper de donnĂ©es distantes. L'utilisation rĂ©pĂ©tĂ©e de la mĂȘme option n'est pas autorisĂ©e (bien qu'il soit possible qu'une option de table et de colonne ait le mĂȘme nom).

Notes

Les contraintes sur les tables distantes (comme les clauses CHECK ou NOT NULL) ne sont pas vĂ©rifiĂ©es par le systĂšme PostgreSQL, et la plupart des wrappers de donnĂ©es distantes ne cherchent pas non plus Ă  les vĂ©rifier. La contrainte est supposĂ©e ĂȘtre vraie. Il y aurait peu de raisons de la vĂ©rifier car elles ne s'appliqueraient qu'aux lignes insĂ©rĂ©es ou mises Ă  jour via la table distante, et pas aux lignes modifiĂ©es d'une autre façon, comme directement sur le serveur distant. À la place, une contrainte attachĂ©e Ă  une table distante doit reprĂ©senter une contrainte vĂ©rifiĂ©e par le serveur distant.

Certains wrappers de donnĂ©es distantes, dont le but est trĂšs spĂ©cifique, pourraient ĂȘtre le seul mĂ©canisme d'accĂšs aux donnĂ©es accĂ©dĂ©es. Dans ce cas, il pourrait ĂȘtre appropriĂ© au wrapper de donnĂ©es distantes de s'assurer de la vĂ©rification de la contrainte. Mais vous ne devez pas supposer qu'un wrapper le fait, sauf si sa documentation le prĂ©cise.

Bien que PostgreSQL ne tente pas de vĂ©rifier les contraintes sur les tables distantes, il suppose qu'elles sont vĂ©rifiĂ©es et les utilise pour optimiser les requĂȘtes. S'il y a des lignes visibles dans la table distante qui ne satisfont pas une contrainte dĂ©clarĂ©e, les requĂȘtes sur la table pourraient produire des erreurs ou des rĂ©ponses incorrectes. C'est de la responsabilitĂ© de l'utilisateur de s'assurer que la dĂ©finition de la contrainte correspond Ă  la rĂ©alitĂ©.

Attention

Quand une table distante est utilisée comme partition d'une table partitionnée, il existe une contrainte implicite que son contenu doit satisfaire la rÚgle de partitionnement. Là aussi, c'est de la responsabilité de l'utilisateur que de s'assurer que cela est vrai, ce qui se fait en installer une contrainte correspondante sur le serveur distant.

Dans une table partitionnĂ©e contenant des tables distantes comme partitions, une requĂȘte UPDATE pouvant modifier la valeur de la clĂ© de partitionnement peut causer le dĂ©placement de la ligne d'une partition locale Ă  une partition distante, Ă  condition que le Foreign Data Wrapper rĂ©alise le routage de la ligne. NĂ©anmoins, il n'est actuellement pas possible de dĂ©placer une ligne d'une partition distante vers une autre partition. Une requĂȘte UPDATE qui devra le faire Ă©chouera Ă  cause de la contrainte de partitionnement, en supposant que c'est correctement assurĂ©e par le serveur distant.

Des considĂ©rations similaires s'appliquent aux colonnes gĂ©nĂ©rĂ©es. Les colonnes gĂ©nĂ©rĂ©es stockĂ©es sont calculĂ©es au moment de l'insertion et des mises Ă  jour sur le serveur PostgreSQL local, et passĂ©s au wrapper de donnĂ©es distantes pour les Ă©crire dans le stockage distant, mais il n'est pas garanti qu'une requĂȘte sur la table distante renvoie des valeurs pour les colonnes gĂ©nĂ©rĂ©es en cohĂ©rence avec l'expression de gĂ©nĂ©ration. A nouveau, cela peut engendrer des rĂ©sultats de requĂȘte incorrects.

Exemples

Créer une table distante films qui sera parcourue via le serveur serveur_film :

CREATE FOREIGN TABLE films (
    code        char(5) NOT NULL,
    title       varchar(40) NOT NULL,
    did         integer NOT NULL,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute
)
SERVER serveur_films;
   

Créer une table distante measurement_y2016m07, qui sera accédée au travers du serveur server_07, comme une partition de la table partitionnée par intervalles measurement :

CREATE FOREIGN TABLE measurement_y2016m07
    PARTITION OF measurement FOR VALUES FROM ('2016-07-01') TO ('2016-08-01')
    SERVER server_07;
   

Compatibilité

La commande CREATE FOREIGN TABLE est conforme au standard SQL. Toutefois, tout comme la commande CREATE TABLE, l'usage de la contrainte NULL et des tables distantes sans colonnes sont autorisés. La possibilité de spécifier des valeurs par défaut pour les colonnes est aussi une extension de PostgreSQL. L'héritage de table, dans la forme définie par PostgreSQL, n'est pas standard.