CREATE FOREIGN TABLE#
CREATE FOREIGN TABLE
CREATE FOREIGN TABLE — определить новую внешнюю таблицу
Синтаксис
CREATE FOREIGN TABLE [ IF NOT EXISTS ]table_name
( [ {column_name
data_type
[ OPTIONS (option
'value
' [, ... ] ) ] [ COLLATEcollation
] [column_constraint
[ ... ] ] |table_constraint
} [, ... ] ] ) [ INHERITS (parent_table
[, ... ] ) ] SERVERserver_name
[ OPTIONS (option
'value
' [, ... ] ) ] CREATE FOREIGN TABLE [ IF NOT EXISTS ]table_name
PARTITION OFparent_table
[ ( {column_name
[ WITH OPTIONS ] [column_constraint
[ ... ] ] |table_constraint
} [, ... ] ) ] { FOR VALUESpartition_bound_spec
| DEFAULT } SERVERserver_name
[ OPTIONS (option
'value
' [, ... ] ) ] wherecolumn_constraint
is: [ CONSTRAINTconstraint_name
] { NOT NULL | NULL | CHECK (expression
) [ NO INHERIT ] | DEFAULTdefault_expr
| GENERATED ALWAYS AS (generation_expr
) STORED } andtable_constraint
is: [ CONSTRAINTconstraint_name
] CHECK (expression
) [ NO INHERIT ] andpartition_bound_spec
is: IN (partition_bound_expr
[, ...] ) | FROM ( {partition_bound_expr
| MINVALUE | MAXVALUE } [, ...] ) TO ( {partition_bound_expr
| MINVALUE | MAXVALUE } [, ...] ) | WITH ( MODULUSnumeric_literal
, REMAINDERnumeric_literal
)
Описание
CREATE FOREIGN TABLE
создает новую внешнюю таблицу
в текущей базе данных. Таблица будет принадлежать пользователю, выполняющему
команду.
Если указано имя схемы (например, CREATE FOREIGN TABLE
myschema.mytable ...
), то таблица создается в указанной
схеме. В противном случае она создается в текущей схеме.
Имя внешней таблицы должно отличаться от имени любого другого отношения (таблицы, последовательности, индекса, представления,
материализованного представления или внешней таблицы) в той же схеме.
CREATE FOREIGN TABLE
также автоматически создает тип данных, который представляет составной тип, соответствующий одной строке внешней таблицы. Поэтому внешние таблицы не могут иметь того же имени, что и существующий тип данных в той же схеме.
Если указано предложение PARTITION OF
, то таблица создается как секция parent_table
с указанными границами.
Для возможности создания внешней таблицы необходимо иметь привилегию USAGE
на внешнем сервере, а также привилегию USAGE
на всех типах столбцов, используемых в таблице.
Параметры
IF NOT EXISTS
Не генерировать ошибку, если уже существует отношение с таким же именем. В этом случае будет выдано уведомление. Обратите внимание, что не гарантируется, что существующее отношение будет похоже на то, которое было бы создано.
table_name
Имя (опционально с указанием схемы) создаваемой таблицы.
column_name
Имя столбца, который будет создан в новой таблице.
data_type
Тип данных столбца. Это может включать спецификаторы массива. Для получения дополнительной информации о типах данных, поддерживаемых Tantor SE-1C, см. Глава 8.
COLLATE
collation
Предложение
COLLATE
назначает правило сортировки столбцу (который должен быть сортируемым типом данных). Если не указано, используется правило сортировки по умолчанию для типа данных столбца.INHERITS (
parent_table
[, ... ] )Необязательное предложение
INHERITS
указывает список таблиц, от которых новая внешняя таблица автоматически наследует все столбцы. Родительские таблицы могут быть обычными таблицами или внешними таблицами. См. аналогичную формуCREATE TABLE
для получения более подробной информации.PARTITION OF
parent_table
{ FOR VALUESpartition_bound_spec
| DEFAULT }Эта форма может быть использована для создания внешней таблицы в качестве секции данной родительской таблицы с указанными значениями границ секций. См. аналогичную форму
CREATE TABLE
для получения более подробной информации. Обратите внимание, что в настоящее время нельзя создать внешнюю таблицу в качестве секции родительской таблицы, если на родительской таблице есть индексыUNIQUE
. (См. такжеALTER TABLE ATTACH PARTITION
).CONSTRAINT
constraint_name
Необязательное имя для ограничения столбца или таблицы. Если ограничение нарушено, имя ограничения присутствует в сообщениях об ошибках, поэтому можно использовать имена ограничений вроде
col must be positive
, чтобы передать полезную информацию об ограничении клиентским приложениям. (Двойные кавычки необходимы для указания имен ограничений, содержащих пробелы). Если имя ограничения не указано, система генерирует имя.NOT NULL
Столбец не может содержать пустые значения.
NULL
Столбец может содержать значения null. Это значение по умолчанию.
Это предложение предоставляется только для совместимости с нестандартными базами данных SQL. Его использование не рекомендуется в новых приложениях.
CHECK (
expression
) [ NO INHERIT ]Предложение
CHECK
определяет выражение, которое должно возвращать логический результат, который ожидается от каждой строки во внешней таблице; то есть, выражение должно возвращать TRUE или UNKNOWN, но никогда FALSE, для всех строк во внешней таблице. Ограничение CHECK, указанное как ограничение столбца, должно ссылаться только на значение этого столбца, в то время как выражение, указанное как ограничение таблицы, может ссылаться на несколько столбцов.В настоящее время выражения
CHECK
не могут содержать подзапросы или ссылаться на переменные, отличные от столбцов текущей строки. Можно ссылаться на системный столбецtableoid
, но не на другие системные столбцы.Ограничение, помеченное
NO INHERIT
, не будет распространяться на дочерние таблицы.DEFAULT
default_expr
Предложение
DEFAULT
назначает значение данных по умолчанию для столбца, в котором она появляется в определении столбца. Значение может быть любым выражением без переменных (подзапросы и перекрестные ссылки на другие столбцы в текущей таблице не допускаются). Тип данных выражения по умолчанию должен соответствовать типу данных столбца.Выражение по умолчанию будет использоваться в любой операции вставки, которая не указывает значение для столбца. Если для столбца нет значения по умолчанию, то оно равно NULL.
GENERATED ALWAYS AS (
generation_expr
) STOREDСоздается столбец как генерируемый столбец. Столбец не может быть записан, и при чтении будет возвращен результат указанного выражения.
Важно использовать ключевое слово
STORED
, чтобы указать, что столбец будет вычисляться при записи. (Вычисленное значение будет представлено для хранения во внешнем источнике данных и должно быть возвращено при чтении).Генерирующее выражение может ссылаться на другие столбцы в таблице, но не на другие генерируемые столбцы. Все использованные функции и операторы должны быть постоянными. Ссылки на другие таблицы не допускаются.
server_name
Имя существующего внешнего сервера, который будет использоваться для внешней таблицы. Подробности о создании сервера см. в разделе CREATE SERVER.
OPTIONS (
option
'value
' [, ...] )Опции, связанные с новой внешней таблицей или одним из ее столбцов. Разрешенные имена опций и их значения зависят от каждой обертки внешних данных и проверяются с использованием функции проверки обертки внешних данных. Дублирующиеся имена опций не допускаются (хотя допускается наличие опции таблицы и опции столбца с одинаковым именем).
Примечания
Ограничения на внешние таблицы (такие как предложения CHECK
или NOT NULL
) не применяются в ядре системы Tantor SE-1C, и большинство оберток внешних данных также не пытаются их применять; то есть, предполагается, что ограничение просто соблюдается. Нет смысла в таком применении, поскольку оно будет применяться только к строкам, вставленным или обновленным через внешнюю таблицу, а не к строкам, измененным другими способами, например, напрямую на удаленном сервере. Вместо этого, ограничение, присоединенное к внешней таблице, должно представлять собой ограничение, которое применяется удаленным сервером.
Некоторые специализированные обертки внешних данных могут быть единственным механизмом доступа к данным, которые они обрабатывают, и в этом случае может быть целесообразно, чтобы сама внешняя обертка данных выполняла проверку ограничений. Однако вы не должны предполагать, что обертка выполняет это, если ее документация не говорит об этом.
Хотя Tantor SE-1C не пытается принудительно проверять ограничения на внешних таблицах, он предполагает, что они корректны для целей оптимизации запросов. Если во внешней таблице есть строки, которые не удовлетворяют объявленному ограничению, запросы к таблице могут вызывать ошибки или возвращать некорректные ответы. Пользователь несет ответственность за то, чтобы определение ограничения соответствовало действительности.
Предостережение
Когда внешняя таблица используется в качестве секции секционированной таблицы, существует неявное ограничение, которое должно быть выполнено ее содержимым в соответствии с правилом секционирования. Опять же, ответственность за обеспечение этого лежит на пользователе, что лучше всего сделать, установив соответствующее ограничение на удаленном сервере.
В пределах секционированной таблицы, содержащей секции внешних таблиц,
UPDATE
, который изменяет значение ключа разделения,
может привести к перемещению строки из локальной секции в секцию внешней таблицы,
при условии, что обертка внешних данных поддерживает маршрутизацию кортежей.
Однако в настоящее время невозможно переместить строку из секции внешней таблицы в другую секцию.
UPDATE
, который потребует этого, завершится неудачей
из-за ограничения секционирования, при условии, что это правильно
обеспечивается удаленным сервером.
Аналогичные соображения применимы к генерируемым столбцам. Хранимые генерируемые столбцы вычисляются при вставке или обновлении на локальном сервере Tantor SE-1Cи передаются обертке внешних данных для записи во внешнее хранилище данных, но не требуется, чтобы запрос к внешней таблице возвращал значения для хранимых генерируемых столбцов, согласованные с генерирующим выражением. Опять же, это может привести к неправильным результатам запроса.
Примеры
Создайте внешнюю таблицу 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
и внешние таблицы с нулевым количеством столбцов. Возможность указания значений по умолчанию для столбцов также является расширением Tantor SE-1C. Наследование таблиц, в форме, определенной Tantor SE-1C, является нестандартным.