CREATE FOREIGN TABLE
CREATE FOREIGN TABLE — создать стороннюю таблицу
Синтаксис
CREATE FOREIGN TABLE [ IF NOT EXISTS ]имя_таблицы
( [ {имя_столбца
тип_данных
[ OPTIONS (параметр
'значение
' [, ... ] ) ] [ COLLATEправило_сортировки
] [ограничение_столбца
[ ... ] ] |ограничение_таблицы
| LIKEтаблица_источник
[параметр_LIKE
... ] } [, ... ] ] ) [ INHERITS (таблица_родитель
[, ... ] ) ] SERVERимя_сервера
[ OPTIONS (параметр
'значение
' [, ... ] ) ] CREATE FOREIGN TABLE [ IF NOT EXISTS ]имя_таблицы
PARTITION OFтаблица_родитель
[ ( {имя_столбца
[ WITH OPTIONS ] [ограничение_столбца
[ ... ] ] |ограничение_таблицы
} [, ... ] ) ] { FOR VALUESуказание_границ_секции
| DEFAULT } SERVERимя_сервера
[ OPTIONS (параметр
'значение
' [, ... ] ) ] Здесьограничение_столбца
: [ CONSTRAINTимя_ограничения
] { NOT NULL [ NO INHERIT ] | NULL | CHECK (выражение
) [ NO INHERIT ] | DEFAULTвыражение_по_умолчанию
| GENERATED ALWAYS AS (генерирующее_выражение
) [ STORED | VIRTUAL ] } [ ENFORCED | NOT ENFORCED ] иограничение_таблицы
: [ CONSTRAINTимя_ограничения
] { NOT NULLимя_столбца
[ NO INHERIT ] | CHECK (выражение
) [ NO INHERIT ] } [ ENFORCED | NOT ENFORCED ] ипараметр_LIKE
: { INCLUDING | EXCLUDING } { COMMENTS | CONSTRAINTS | DEFAULTS | GENERATED | STATISTICS | ALL } иуказание_границ_секции
: IN (выражение_границ_секции
[, ...] ) | FROM ( {выражение_границ_секции
| MINVALUE | MAXVALUE } [, ...] ) TO ( {выражение_границ_секции
| MINVALUE | MAXVALUE } [, ...] ) | WITH ( MODULUSчисловая_константа
, REMAINDERчисловая_константа
)
Описание
CREATE FOREIGN TABLE
создаёт новую стороннюю таблицу в текущей базе данных. Владельцем таблицы будет пользователь, выполнивший эту команду.
Если указано имя схемы (например, CREATE FOREIGN TABLE myschema.mytable ...
), таблица будет создана в этой схеме. В противном случае она создаётся в текущей схеме. Имя сторонней таблицы должно отличаться от имён других отношений (таблиц, последовательностей, индексов, представлений, материализованных представлений или сторонних таблиц), существующих в этой схеме.
CREATE FOREIGN TABLE
также автоматически создаёт составной тип данных, соответствующий одной строке сторонней таблицы. Таким образом, имя сторонней таблицы не может совпадать с именем существующего типа в этой же схеме.
Если указано предложение PARTITION OF
, таблица создаётся в виде секции parent_table
с указанными границами.
Чтобы создать стороннюю таблицу, необходимо иметь право USAGE
для стороннего сервера, а также право USAGE
для всех типов столбцов, содержащихся в таблице.
Параметры
IF NOT EXISTS
Не считать ошибкой, если отношение с таким именем уже существует. В этом случае будет выдано замечание. Заметьте, что нет никакой гарантии, что существующее отношение как-то соотносится с тем, которое могло бы быть создано.
имя_таблицы
Имя создаваемой таблицы (возможно, дополненное схемой).
имя_столбца
Имя столбца, создаваемого в новой таблице.
тип_данных
Тип данных столбца (может включать определение массива с этим типом). За дополнительными сведениями о типах данных, которые поддерживает PostgreSQL, обратитесь к Главе 8.
COLLATE
правило_сортировки
Предложение
COLLATE
назначает правило сортировки для столбца (который должен иметь тип, поддерживающий сортировку). Если оно отсутствует, используется правило сортировки по умолчанию, установленное для типа данных столбца.INHERITS (
таблица_родитель
[, ... ] )Необязательное предложение
INHERITS
определяет список таблиц, от которых новая сторонняя таблица будет автоматически наследовать все столбцы. Родительскими таблицами могут быть обычные или сторонние таблицы. За подробностями обратитесь к описанию подобной формыCREATE TABLE
.PARTITION OF
таблица_родитель
{ FOR VALUESуказание_границ_секции
| DEFAULT }Эта форма может использоваться для создания сторонней таблицы в виде секции указанной родительской таблицы с заданными граничными значениями. За подробностями обратитесь к описанию подобной формы команды
CREATE TABLE
. Заметьте, что в настоящее время не допускается создание сторонней таблицы в виде секции родительской таблицы, если в этой таблице есть уникальные индексы (UNIQUE
). (См. также описаниеALTER TABLE ATTACH PARTITION
.)LIKE
таблица_источник
[параметр_LIKE
... ]Предложение
LIKE
определяет таблицу, из которой в новую таблицу будут автоматически скопированы все имена столбцов, их типы данных и их ограничения на NULL.В отличие от
INHERITS
, новая и исходная таблица становятся полностью независимыми после завершения создания. Изменения в исходной таблице не отражаются в новой, а данные новой таблицы не включаются в результат чтения исходной.Кроме того, в отличие от
INHERITS
, столбцы и ограничения, копируемые командойLIKE
, не объединяются с одноимёнными столбцами и ограничениями. Если дублирующееся имя указывается явно или возникает в другом предложенииLIKE
, происходит ошибка.Необязательные предложения
параметр_LIKE
указывают, какие дополнительные свойства исходной таблицы будут копироваться. УказаниеINCLUDING
копирует заданное свойство, аEXCLUDING
исключает его. По умолчанию подразумеваетсяEXCLUDING
. Если к одному типу объекта относятся несколько указаний, будет применяться последнее. Допустимые указания:INCLUDING COMMENTS
Копировать комментарии для скопированных столбцов и ограничений. По умолчанию комментарии не копируются, вследствие чего скопированные столбцы и ограничения в новой таблице оказываются без комментариев.
INCLUDING CONSTRAINTS
Копировать ограничения-проверки (
CHECK
). В данном контексте ограничения на уровне столбцов и на уровне таблицы не различаются. Ограничения NOT NULL копируются в новую таблицу всегда.INCLUDING DEFAULTS
Копировать выражения значений по умолчанию в определениях копируемых столбцов. Без этого указания выражения по умолчанию не копируются, вследствие чего в новой таблице скопированные столбцы получают значения по умолчанию NULL. Заметьте, что при копировании подобных выражений, в которых вызываются функции, модифицирующие БД, как например
nextval
, может образовываться функциональная связь исходной таблицы с новой.INCLUDING GENERATED
Копировать выражения, генерирующие значения для копируемых столбцов. По умолчанию все новые столбцы будут обычными базовыми столбцами.
INCLUDING STATISTICS
Копировать в новую таблицу расширенную статистику.
INCLUDING ALL
Указание
INCLUDING ALL
является сокращённым вариантом выбора всех имеющихся отдельных параметров. (ПослеINCLUDING ALL
можно дополнительно добавить предложенияEXCLUDING
, чтобы выбрать все параметры, за исключением некоторых.)
CONSTRAINT
имя_ограничения
Необязательное имя столбца или ограничения таблицы. При нарушении ограничения его имя будет выводиться в сообщении об ошибках, так что имена ограничений вида
столбец должен быть положительным
могут сообщить полезную информацию об ограничении клиентскому приложению. (Имена ограничений, включающие пробелы, необходимо заключать в двойные кавычки.) Если имя ограничения не указано, система генерирует имя автоматически.NOT NULL
[ NO INHERIT ]Данный столбец не принимает значения NULL.
Ограничение с пометкой
NO INHERIT
не будет наследоваться дочерними таблицами.NULL
Данный столбец может содержать значения NULL (по умолчанию).
Это предложение предназначено только для совместимости с нестандартными базами данных SQL. Использовать его в новых приложениях не рекомендуется.
CHECK (
выражение
) [ NO INHERIT ]В ограничении
CHECK
задаётся выражение, возвращающее логический результат, которому должны удовлетворять все строки в сторонней таблице; то есть это выражение должно выдавать TRUE или UNKNOWN, но никогда FALSE, для всех строк в сторонней таблице. Ограничение-проверка, заданное как ограничение столбца, должно ссылаться только на значение самого столбца, тогда как ограничение на уровне таблицы может ссылаться и на несколько столбцов.В настоящее время выражения
CHECK
не могут содержать подзапросы или ссылаться на переменные, кроме как на столбцы текущей строки. Также допустима ссылка на системный столбецtableoid
, но не на другие системные столбцы.Ограничение с пометкой
NO INHERIT
не будет наследоваться дочерними таблицами.DEFAULT
выражение_по_умолчанию
Предложение
DEFAULT
задаёт значение по умолчанию для столбца, в определении которого оно присутствует. Значение задаётся выражением без переменных (подзапросы и перекрёстные ссылки на другие столбцы текущей таблицы в нём не допускаются). Тип данных выражения, задающего значение по умолчанию, должен соответствовать типу данных столбца.Это выражение будет использоваться во всех операциях добавления данных, в которых не задаётся значение данного столбца. Если значение по умолчанию не определено, таким значением будет NULL.
GENERATED ALWAYS AS (
генерирующее_выражение
) [ STORED | VIRTUAL ]Это предложение создаёт столбец как генерируемый. В такой столбец нельзя записать данные, а при чтении его возвращается результат указанного выражения.
Если указано ключевое слово
VIRTUAL
, столбец вычисляется при чтении. (Обёртка сторонних данных будет воспринимать его какNULL
в новых строках и может выбрать, хранить ли его какNULL
или проигнорировать). Если указаноSTORED
, столбец вычисляется при записи. (Вычисленное значение будет передаваться обёртке сторонних данных, которая должна сохранить его и затем выдавать при чтении.) Значение по умолчанию —VIRTUAL
.Генерирующее выражение может обращаться к другим столбцам таблицы, но не к другим генерируемым столбцам. Все функции и операторы в нём должны быть постоянными. Обращаться к другим таблицам в таких выражениях нельзя.
имя_сервера
Имя существующего стороннего сервера, предоставляющего данную стороннюю таблицу. О создании сервера можно узнать в CREATE SERVER.
OPTIONS (
параметр
'значение
' [, ...] )Параметры, связываемые с новой сторонней таблицей или одним из её столбцов. Допустимые имена и значения параметров у каждой обёртки сторонних данных свои; они контролируются функцией проверки, связанной с этой обёрткой. Имена параметров не должны повторяться (хотя параметр таблицы и параметр столбца вполне могут иметь одно имя).
Примечания
Ограничения сторонних таблиц (например, CHECK
и NOT NULL
) не контролируются ядром системы 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, стандарту не соответствует. Предложение LIKE
, поддерживаемое этой командой, также не соответствует стандарту.