CREATE FOREIGN TABLE#

CREATE FOREIGN TABLE

CREATE FOREIGN TABLE

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 ...), то таблица создается в указанной схеме. В противном случае она создается в текущей схеме. Имя внешней таблицы должно отличаться от имени любого другого отношения (таблицы, последовательности, индекса, представления, материализованного представления или внешней таблицы) в той же схеме.

CREATE FOREIGN TABLE также автоматически создает тип данных, который представляет составной тип, соответствующий одной строке внешней таблицы. Поэтому внешние таблицы не могут иметь того же имени, что и существующий тип данных в той же схеме.

Если указано предложение PARTITION OF, то таблица создается как раздел parent_table с указанными границами.

Для возможности создания внешней таблицы необходимо иметь привилегию USAGE на внешнем сервере, а также привилегию USAGE на всех типах столбцов, используемых в таблице.

Параметры

IF NOT EXISTS

Не генерировать ошибку, если уже существует отношение с таким же именем. В этом случае будет выдано уведомление. Обратите внимание, что не гарантируется, что существующее отношение будет похоже на то, которое было бы создано.

table_name

Имя (опционально с указанием схемы) создаваемой таблицы.

column_name

Имя столбца, который будет создан в новой таблице.

data_type

Тип данных столбца. Это может включать спецификаторы массива. Для получения дополнительной информации о типах данных, поддерживаемых Tantor SE, см. Глава 8.

COLLATE collation

Предложение COLLATE назначает правило сортировки столбцу (который должен быть сортируемым типом данных). Если не указано, используется правило сортировки по умолчанию для типа данных столбца.

INHERITS ( parent_table [, ... ] )

Необязательное предложение INHERITS указывает список таблиц, от которых новая внешняя таблица автоматически наследует все столбцы. Родительские таблицы могут быть обычными таблицами или внешними таблицами. См. аналогичную форму 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. Это значение по умолчанию.

Это предложение предоставляется только для совместимости с нестандартными базами данных 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, и большинство оберток внешних данных также не пытаются их применять; то есть, предполагается, что ограничение просто соблюдается. Нет смысла в таком применении, поскольку оно будет применяться только к строкам, вставленным или обновленным через внешнюю таблицу, а не к строкам, измененным другими способами, например, напрямую на удаленном сервере. Вместо этого, ограничение, присоединенное к внешней таблице, должно представлять собой ограничение, которое применяется удаленным сервером.

Некоторые специализированные внешние обертки данных могут быть единственным механизмом доступа к данным, которые они обрабатывают, и в этом случае может быть целесообразно, чтобы сама внешняя обертка данных выполняла проверку ограничений. Однако вы не должны предполагать, что обертка выполняет это, если ее документация не говорит об этом.

Хотя Tantor SE не пытается принудительно проверять ограничения на внешних таблицах, он предполагает, что они корректны для целей оптимизации запросов. Если во внешней таблице есть строки, которые не удовлетворяют объявленному ограничению, запросы к таблице могут вызывать ошибки или возвращать некорректные ответы. Пользователь несет ответственность за то, чтобы определение ограничения соответствовало действительности.

Предостережение

Когда внешняя таблица используется в качестве раздела разделенной таблицы, существует неявное ограничение, которое должно быть выполнено ее содержимым в соответствии с правилом разделения. Опять же, ответственность за обеспечение этого лежит на пользователе, что лучше всего сделать, установив соответствующее ограничение на удаленном сервере.

В пределах партицированной таблицы, содержащей секции внешних таблиц, UPDATE, который изменяет значение ключа секционирования, может привести к перемещению строки из локальной секции в секцию внешней таблицы, при условии, что обертка внешних данных поддерживает маршрутизацию кортежей. Однако в настоящее время невозможно переместить строку из секции внешней таблицы в другую секцию. UPDATE, который потребует этого, завершится неудачей из-за ограничения секционирования, при условии, что это правильно обеспечивается удаленным сервером.

Аналогичные соображения применимы к вычисляемым столбцам. Хранимые вычисляемые столбцы вычисляются при вставке или обновлении на локальном сервере Tantor SEи передаются обертке внешних данных для записи во внешнее хранилище данных, но не требуется, чтобы запрос к внешней таблице возвращал значения для хранимых вычисляемых столбцов, согласованные с выражением генерации. Опять же, это может привести к неправильным результатам запроса.

Примеры

Создайте внешнюю таблицу 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. Наследование таблиц, в форме, определенной Tantor SE, является нестандартным.