CREATE FOREIGN TABLE
Эта страница переведена при помощи нейросети GigaChat.
CREATE FOREIGN TABLE
— создание новой внешней таблицы.
Синтаксис
CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name ( [
{ column_name data_type [ OPTIONS ( option 'value' [, ... ] ) ] [ COLLATE collation ] [ column_constraint [ ... ] ]
| table_constraint }
[, ... ]
] )
[ INHERITS ( parent_table [, ... ] ) ]
SERVER server_name
[ OPTIONS ( option 'value' [, ... ] ) ]
CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name
PARTITION OF parent_table [ (
{ column_name [ WITH OPTIONS ] [ column_constraint [ ... ] ]
| table_constraint }
[, ... ]
) ]
{ FOR VALUES partition_bound_spec | DEFAULT }
SERVER server_name
[ OPTIONS ( option 'value' [, ... ] ) ]
where column_constraint is:
[ CONSTRAINT constraint_name ]
{ NOT NULL |
NULL |
CHECK ( expression ) [ NO INHERIT ] |
DEFAULT default_expr |
GENERATED ALWAYS AS ( generation_expr ) STORED }
and table_constraint is:
[ CONSTRAINT constraint_name ]
CHECK ( expression ) [ NO INHERIT ]
and partition_bound_spec is:
IN ( partition_bound_expr [, ...] ) |
FROM ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] )
TO ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] ) |
WITH ( MODULUS numeric_literal, REMAINDER numeric_literal )
Описание
CREATE FOREIGN TABLE
используется для создания новой внешней таблицы в текущей базе данных. Владельцем создаваемой таблицы становится пользователь, выполнивший эту команду.
Если указано имя схемы (например, CREATE FOREIGN TABLE myschema.mytable ...
), то таблица создается в этой схеме. В противном случае она создается в текущей схеме пользователя. Название внешней таблицы не должно совпадать с именем других объектов (таблиц, последовательностей, индексов, представлений, материализованных представлений или других внешних таблиц) в той же схеме.
Одновременно с созданием внешней таблицы автоматически создается составной тип данных, соответствующий строке этой таблицы. Поэтому имя внешней таблицы также не должно дублировать имя уже существующего типа данных в той же схеме.
Если используется конструкция PARTITION OF
, то таблица создается как раздел parent_table
с заданными границами.
Для создания внешней таблицы необходимы привилегии USAGE
на используемый внешний сервер и на все типы данных, применяемые в столбцах таблицы.
Параметры
IF NOT EXISTS
- Подавляет ошибку, если внешняя таблица с указанным именем уже существует, вместо этого будет выдано уведомление. Однако совпадение имени не гарантирует совпадение структуры.
table_name
- Задает имя внешней таблицы, при необходимости дополненное схемой, которая должна быть создана.
column_name
- Задает имя столбца, который будет создан в новой таблице.
data_type
- Задает тип данных столбца. Можно использовать определение массива с этим типом.
COLLATE collation
- Указывает правило сортировки для столбца, который должен иметь тип, поддерживающий сортировку. Если не указано, используется правило сортировки по умолчанию для данного типа данных столбца.
INHERITS (parent_table [, ... ])
- Опциональное указание родительских таблиц, от которых новая внешняя таблица унаследует все столбцы. Родительскими таблицами могут быть как обычные таблицы, так и внешние. Смотрите аналогичную форму команды CREATE TABLE для получения более подробной информации.
PARTITION OF parent_table { FOR VALUES partition_bound_spec | DEFAULT}
- Используется для создания внешней таблицы как раздела указанной родительской таблицы с заданными границами раздела. Смотрите аналогичную форму команды CREATE TABLE для получения более подробной информации. В текущей версии невозможно использовать внешние таблицы в качестве разделов, если на родительской таблице есть
UNIQUE
индексы. Смотрите также ALTER TABLE ATTACH PARTITION.
CONSTRAINT constraint_name
- Опциональное указание ограничения для столбца или таблицы. Если ограничение нарушается, его имя будет отображено в сообщении об ошибке, поэтому можно использовать описательные имена, такие как
col must be positive
— это может быть полезно для клиентских приложений. Имена с пробелами должны быть заключены в двойные кавычки. Если имя не задано, оно будет создано автоматически.
NOT NULL
- Запрещает использование
NULL
в указанном столбце.
NULL
- Разрешает значения
NULL
в столбце. Это значение по умолчанию.Используется для совместимости с базами данных SQL, не соответствующими стандарту, и не рекомендуется в новых приложениях.
CHECK (expression) [ NO INHERIT ]
- Задает логическое выражение, которому должна удовлетворять каждая строка во внешней таблице — результат выражения должен быть
TRUE
илиUNKNOWN
, но неFALSE
.Если ограничение задано на уровне столбца, выражение должно ссылаться только на этот столбец. Если это ограничение таблицы, оно может охватывать несколько столбцов.
На текущий момент выражения
CHECK
не может содержать подзапросы и не может ссылаться на переменные, отличные от столбцов текущей строки. Допустимо использовать системную колонкуtableoid
, но остальные системные столбцы использовать нельзя.Если ограничение помечено как
NO INHERIT
, оно не будет автоматически применяться к дочерним таблицам.
DEFAULT default_expr
- Назначает значение по умолчанию для столбца. Это значение используется при вставке строки, если явно не указано значение для этого столбца.
Значением по умолчанию может быть только выражение, не содержащее переменных, подзапросов или ссылок на другие столбцы той же таблицы. Тип выражения должен соответствовать типу данных столбца.
Если
DEFAULT
не указан, в качестве значения по умолчанию используетсяNULL
.
GENERATED ALWAYS AS (generation_expr) STORED
- Определяет сгенерированный столбец, значение которого вычисляется автоматически при вставке строки и не может быть задано явно.
Обязательное ключевое слово
STORED
указывает, что столбец будет вычисляться при записи. Вычисленное значение будет представлено внешней оболочке данных для хранения и должно быть возвращено при чтении.Выражение генерации может ссылаться на другие обычные столбцы той же таблицы, но не на другие сгенерированные столбцы. Все функции и операторы в выражении должны быть постоянными. Ссылки на другие таблицы не допускаются.
server_name
- Задает имя существующего внешнего сервера, к которому будет привязана внешняя таблица. Подробнее о создании серверов описано в разделе CREATE SERVER.
OPTIONS (option 'value' [, ...])
- Задает набор параметров, которые задаются для внешней таблицы или отдельных ее столбцов.
Список допустимых параметров и их значений зависит от используемой оболочки внешних данных (FDW) и проверяется через ее функцию валидации.
Использование одинаковых имен параметров недопустимо, за исключением случая, когда одно и то же имя используется отдельно для таблицы и для ее столбца.
Примечания
Ограничения, такие как CHECK
или NOT NULL
, на внешние таблицы не применяются ядром PostgreSQL, и чаще всего не обрабатываются внешними оболочками. Считается, что они просто выполняются.
Проверка таких ограничений внутри PostgreSQL не имела бы большого смысла, поскольку она охватывала бы только те строки, которые вставляются или изменяются через внешнюю таблицу, но не затрагивала бы данные, обновленные другими способами (например, напрямую на удаленном сервере). Таким образом, любые ограничения, указанные во внешней таблице, должны быть реализованы и обеспечены на стороне удаленного сервера.
Некоторые специализированные оболочки данных могут быть единственным способом обращения к доступным через них данным. В таких случаях может быть уместно реализовать контроль ограничений в самой такой оболочке. Однако не следует полагать, что какая-либо оболочка ведет себя так, если об этом не сказано явно в ее документации.
Несмотря на то что PostgreSQL не применяет ограничения к внешним таблицам, он все же использует их для оптимизации выполнения запросов. Поэтому, если данные во внешней таблице не соответствуют объявленным ограничениям, это может привести к ошибкам выполнения или к получению некорректных результатов. Ответственность за выполнение условия ограничения полностью лежит на пользователе.
Если внешняя таблица используется как партиция партиционированной таблицы, то подразумевается, что ее содержимое соответствует правилам партиционирования. Гарантировать это должен пользователь, и лучшим способом будет применение соответствующих ограничений на удаленном сервере.
В случае, когда внешние таблицы используются как партиции в партиционированной таблице, команда UPDATE
, изменяющая значение ключа партиционирования, может переместить строку из локальной партиции во внешнюю, если оболочка поддерживает такую маршрутизацию. Однако в обратную сторону — из внешней партиции в другую (локальную или внешнюю) — перемещение невозможно. Команда UPDATE
, вызывающая такое перемещение, прервется ошибкой из-за ограничения партиций, если на удаленном сервере установлено нужное ограничение.
Аналогичная логика применима и к сохраненным сгенерированным столбцам. Такие столбцы вычисляются на стороне PostgreSQL при вставке или обновлении и передаются оболочке внешних данных для записи во внешнее хранилище данных. Однако при последующих запросах к внешней таблице нет гарантий, что возвращаемые значения этих столбцов будут соответствовать выражению генерации. Это может привести к неправильным результатам выполнения запросов.
Примеры
Создание внешней таблицы films
, доступ к которой осуществляется через сервер film_server
:
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 film_server;
Создание внешней таблицы measurement_y2016m07
, доступ к которой осуществляется через сервер server_07
в виде партиции таблицы measurement
, партиционированной по диапазонам:
CREATE FOREIGN TABLE measurement_y2016m07
PARTITION OF measurement FOR VALUES FROM ('2016-07-01') TO ('2016-08-01')
SERVER server_07;
Совместимость
Команда CREATE FOREIGN TABLE
в значительной степени соответствует стандарту SQL, однако, так же, как и с CREATE TABLE, допускаются ограничения NULL
и внешние таблицы без столбцов. Возможность указания значений по умолчанию для столбца также является расширением PostgreSQL. Наследование таблиц в форме, определенной PostgreSQL, не соответствует стандартам.
Смотрите также
ALTER FOREIGN TABLE, DROP FOREIGN TABLE, CREATE TABLE, CREATE SERVER, IMPORT FOREIGN SCHEMA