CREATE FOREIGN TABLE

CREATE FOREIGN TABLE — определить новую стороннюю таблицу

Синтаксис

CREATE FOREIGN TABLE [ IF NOT EXISTS ] имя_таблицы ( [
  { имя_столбца тип_данных [ OPTIONS ( параметр 'значение' [, ... ] ) ] [ COLLATE правило_сортировки ] [ ограничение_столбца [ ... ] ]
    | ограничение_таблицы }
    [, ... ]
] )
[ INHERITS ( таблица_родитель [, ... ] ) ]
  SERVER имя_сервера
[ OPTIONS ( параметр 'значение' [, ... ] ) ]

CREATE FOREIGN TABLE [ IF NOT EXISTS ] имя_таблицы
  PARTITION OF таблица_родитель [ (
  { имя_столбца [ WITH OPTIONS ] [ ограничение_столбца [ ... ] ]
    | ограничение_таблицы }
    [, ... ]
) ] указание_границ_партиции
  SERVER имя_сервера
[ OPTIONS ( параметр 'значение' [, ... ] ) ]

Где ограничение_столбца может быть:

[ CONSTRAINT имя_ограничения ]
{ NOT NULL |
  NULL |
  CHECK ( выражение ) [ NO INHERIT ] |
  DEFAULT выражение_по_умолчанию |
  GENERATED ALWAYS AS ( генерирующее_выражение ) STORED }

Где ограничение_таблицы может быть:

[ CONSTRAINT имя_ограничения ]
CHECK ( выражение ) [ NO INHERIT ]

Описание

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

Если задано имя схемы (например, CREATE FOREIGN TABLE myschema.mytable ...), то таблица создается в указанной схеме, в противном случае — в текущей. Имя сторонней таблицы должно отличаться от имени любой другой сторонней таблицы, а также таблицы, последовательности, индекса, представления или материализованного представления в той же схеме.

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

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

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

Параметры

IF NOT EXISTS

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

имя_таблицы

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

имя_столбца

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

тип_данных

Тип данных столбца. Может включать спецификаторы массива с этим типом. Более подробную информацию о типах данных, поддерживаемых QHB, см. в главе Типы данных.

COLLATE правило_сортировки

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

INHERITS ( таблица_родитель [, ... ] )

Необязательное предложение INHERITS задает список таблиц, из которых новая сторонняя таблица автоматически наследует все столбцы. Родительские таблицы могут быть простыми или сторонними таблицами. Более подробную информацию см. в аналогичной форме команды CREATE TABLE.

PARTITION OF таблица_родитель FOR VALUES указание_границ_партиции

Эта форма может быть использована для создания сторонней таблицы в качестве партиции указанной родительской таблицы с заданными граничными значениями. Более подробную информацию см. в аналогичной форме команды CREATE TABLE. Обратите внимание, что в настоящее время не разрешается создавать стороннюю таблицу в качестве партиции родительской таблицы, если в последней есть индексы UNIQUE (уникальные). (См. также раздел ALTER TABLE ATTACH PARTITION.)

CONSTRAINT имя_ограничения

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

NOT NULL

Столбец не может содержать значения NULL.

NULL

Столбец может содержать значения NULL. Это значение по умолчанию.

Это предложение предусмотрено только для обеспечения совместимости с нестандартными базами данных SQL. В новых приложениях его использование не рекомендуется.

CHECK ( выражение ) [ NO INHERIT ]

Предложение CHECK задает выражение, производящее логический результат, которому должна удовлетворять каждая строка в сторонней таблице; то есть выражение должно выдавать TRUE или UNKNOWN, но не FALSE для всех строк в сторонней таблице. Проверочное ограничение, указанное в качестве ограничения столбца, должно ссылаться только на значение этого столбца, тогда как выражение, указанное в ограничении таблицы, может ссылаться на несколько столбцов.

В настоящий момент выражения CHECK не могут содержать вложенные запросы и ссылаться на переменные, отличные от столбцов текущей строки. Также допустима ссылка на системный столбец tableoid, но не на другие системные столбцы.

Ограничение с пометкой NO INHERIT не будет наследоваться дочерними таблицами.

DEFAULT выражение_по_умолчанию

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

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

GENERATED ALWAYS AS ( генерирующее_выражение ) STORED

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

Ключевое слово STORED требуется для обозначения того, что столбец будет вычисляться при записи. (Вычисленное значение будет передаваться обертке сторонних данных для сохранения и должно быть возвращено оберткой при чтении.)

Генерирующее выражение может ссылаться на другие столбцы в таблице, но не на другие генерируемые столбцы. Все функции и операторы в нем должны быть постоянными. Ссылки на другие таблицы не допускаются.

имя_сервера

Имя существующего стороннего сервера, используемого для сторонней таблицы. Дополнительную информацию об определении сервера см. в разделе CREATE SERVER.

OPTIONS ( параметр 'значение' [, ...] )

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

Примечания

Ограничения сторонних таблицы (такие как CHECK или NOT NULL) не контролируются ядром системы QHB, и большинство оберток сторонних данных также не пытаются их контролировать; то есть система просто предполагает, что ограничение выполняется. Подобный контроль был бы нецелесообразен, поскольку применялся бы только к строкам, добавленным или обновленным через стороннюю таблицу, а не к строкам, измененным другими способами, например непосредственно на удаленном сервере. Вместо этого ограничение, связанное со сторонней таблицей, должно представлять собой ограничение, контролируемое удаленным сервером.

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

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

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

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

Примеры

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

См. также

ALTER FOREIGN TABLE, DROP FOREIGN TABLE, CREATE TABLE, CREATE SERVER, IMPORT FOREIGN SCHEMA