CREATE TABLE

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

Синтаксис

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] имя_таблицы ( [
  { имя_столбца тип_данных [ COLLATE правило_сортировки ] [ ограничение_столбца [ ... ] ]
    | ограничение_таблицы
    | LIKE исходная_таблица [ вариант_копирования ... ] }
    [, ... ]
] )
[ INHERITS ( таблица_родитель [, ... ] ) ]
[ PARTITION BY { RANGE | LIST | HASH } ( { имя_столбца | ( выражение ) } [ COLLATE правило_сортировки ] [ класс_операторов ] [, ... ] ) ]
[ USING метод ]
[ WITH ( параметр_хранения [= значение] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE имя_табличного_пространства ]

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] имя_таблицы
    OF имя_типа [ (
  { имя_столбца [ WITH OPTIONS ] [ ограничение_столбца [ ... ] ]
    | ограничение_таблицы }
    [, ... ]
) ]
[ PARTITION BY { RANGE | LIST | HASH } ( { имя_столбца | ( выражение ) } [ COLLATE правило_сортировки ] [ класс_операторов ] [, ... ] ) ]
[ USING метод ]
[ WITH ( параметр_хранения [= значение] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE имя_табличного_пространства ]

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] имя_таблицы
    PARTITION OF таблица_родитель [ (
  { имя_столбца [ WITH OPTIONS ] [ ограничение_столбца [ ... ] ]
    | ограничение_таблицы }
    [, ... ]
) ] { FOR VALUES указание_границ_партиции | DEFAULT }
[ PARTITION BY { RANGE | LIST | HASH } ( { имя_столбца | ( выражение ) } [ COLLATE правило_сортировки ] [ класс_операторов ] [, ... ] ) ]
[ USING метод ]
[ WITH ( параметр_хранения [= значение] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE имя_табличного_пространства ]

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

[ CONSTRAINT имя_ограничения ]
{ NOT NULL |
  NULL |
  CHECK ( выражение ) [ NO INHERIT ] |
  DEFAULT выражение_по_умолчанию |
  GENERATED ALWAYS AS ( выражение_генерации ) STORED |
  GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( параметры_последовательности ) ] |
  UNIQUE параметры_индекса |
  PRIMARY KEY параметры_индекса |
  REFERENCES ссылочная_таблица [ ( ссылочный_столбец ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
    [ ON DELETE ссылочное_действие ] [ ON UPDATE ссылочное_действие ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

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

[ CONSTRAINT имя_ограничения ]
{ CHECK ( выражение ) [ NO INHERIT ] |
  UNIQUE ( имя_столбца [, ... ] ) параметры_индекса |
  PRIMARY KEY ( имя_столбца [, ... ] ) параметры_индекса |
  EXCLUDE [ USING индексный_метод ] ( элемент_исключения WITH оператор [, ... ] ) параметры_индекса [ WHERE ( предикат ) ] |
  FOREIGN KEY ( имя_столбца [, ... ] ) REFERENCES целевая_таблица [ ( целевой_столбец [, ... ] ) ]
    [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE ссылочное_действие ] [ ON UPDATE ссылочное_действие ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

Где вариант_копирования может быть::

{ INCLUDING | EXCLUDING } { COMMENTS | CONSTRAINTS | DEFAULTS | GENERATED | IDENTITY | INDEXES | STATISTICS | STORAGE | ALL }

Где указание_границ_партиции может быть:

IN ( выражение_границ_партиции [, ...] ) |
FROM ( { выражение_границ_партиции | MINVALUE | MAXVALUE } [, ...] )
  TO ( { выражение_границ_партиции | MINVALUE | MAXVALUE } [, ...] ) |
WITH ( MODULUS числовая_константа, REMAINDER числовая_константа )

Где параметр_индекса в ограничениях UNIQUE, PRIMARY KEY и EXCLUDE может быть:

[ INCLUDE ( имя_столбца [, ... ] ) ]
[ WITH ( параметр_хранения [= значение] [, ... ] ) ]
[ USING INDEX TABLESPACE имя_табличного_пространства ]

Где элемент_исключения в ограничении EXCLUDE может быть:

{ имя_столбца | ( выражение ) } [ класс_операторов ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]

Описание

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

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

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

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

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

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

Параметры

TEMPORARY или TEMP

Если указан этот параметр, таблица создается как временная таблица. Временные таблицы автоматически удаляются в конце сеанса или, при необходимости, в конце текущей транзакции (см. подраздел ON COMMIT ниже). Существующие постоянные таблицы с одинаковыми именами не видны текущему сеансу, пока существует временная таблица, если только они не связаны с именами, определенными схемой. Все индексы, созданные во временной таблице, также автоматически являются временными.

Процесс «Автовакуум» не может получить доступ и, следовательно, не может очищать или анализировать временные таблицы. По этой причине соответствующие операции очистки и анализа должны выполняться с помощью команд сеанса SQL. Например, если временная таблица будет использоваться в сложных запросах, целесообразно после ее заполнения запустить ANALYZE для временной таблицы.

При желании перед TEMPORARY или *TEMP можно написать GLOBAL или LOCAL. В настоящее время в QHB это не имеет никакого значения и является устаревшей опцией; см. раздел Cовместимость.

UNLOGGED

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

IF NOT EXISTS

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

имя_таблицы

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

OF имя_типа

Создает типизированную таблицу, которая берет свою структуру из указанного составного типа (имя может быть дополнено схемой). Типизированная таблица привязывается к своему типу: например, таблица будет удалена, если тип будет удален (с DROP TYPE ... CASCADE).

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

имя_столбца

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

тип_данных

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

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

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

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

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

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

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

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

Параметры STORAGE для столбца также копируются из родительских таблиц.

Если столбец в родительской таблице является столбцом идентификаторов, это свойство не наследуется. При желании столбец в дочерней таблице можно объявить столбцом идентификаторов.

PARTITION BY { RANGE | LIST | HASH } ( { имя_столбца | ( выражение ) } [ класс_операторов ] [, ...] )

Необязательное предложение PARTITION BY задает стратегию разбиения таблицы. Созданная таким образом таблица называется партиционированной таблицей. Заключенный в скобки список столбцов или выражений формирует ключ разбиения для таблицы. При использовании партиционирования по диапазонам или по хэшу ключ разбиения может включать несколько столбцов или выражений (до 32, но это ограничение может быть изменено при создании QHB), но для партиционирования по списку ключ разбиения должен состоять из одного столбца или выражения.

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

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

Партиционированные таблицы не поддерживают ограничение EXCLUDE, однако эти ограничения можно определить для отдельных партиций.

Дополнительную информацию о партиционировании таблиц см. в разделе Партиционирование таблиц.

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

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

указание_границ_партиции должно соответствовать методу и ключу разбиения родительской таблицы и не должно перекрываться ни с какой существующей партицией этого родителя. Форма с IN используется для партиционирования по списку, форма с FROM и TO — для партиционирования по диапазонам, а форма с WITH — для партиционирования по хэшу.

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

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

При создании диапазонной партиции нижняя граница, заданная с помощью FROM, является включающей границей, тогда как верхняя граница, заданная с помощью TO, является исключающей границей. То есть значения, указанные в списке FROM, — это допустимые значения соответствующих столбцов ключа разбиения для данной партиции, тогда как значения в списке TO таковыми не являются. Обратите внимание, что это утверждение следует понимать в соответствии с правилами сравнения строк (см. раздел Сравнение конструкторов строк). Например, с разделением PARTITION BY RANGE (x,y) партиция с границами FROM (1, 2) TO (3, 4) примет x=1 с любым значением y>=2, x=2 — с любым значением y, отличным от NULL, и x=3 — с любым y<4.

При создании диапазонной партиции можно использовать особые значения MINVALUE и MAXVALUE, чтобы указать, что нет нижней или верхней границы значения столбца. Например, партиция, определенная с помощью FROM (MINVALUE) TO (10) принимает любые значения меньше 10, а партиция, определенная с помощью FROM (10) TO (MAXVALUE), принимает любые значения, превышающие или равные 10.

При создании диапазонной партиции, включающей более одного столбца, также может иметь смысл использовать MAXVALUE как часть нижней границы и MINVALUE как часть верхней границы. Например, партиция, определенная с помощью FROM (0, MAXVALUE) TO (10, MAXVALUE), принимает любые строки, в которых первый столбец ключа разбиения больше 0 и меньше или равен 10. Аналогично, партиция, определенная с помощью FROM (’a’, MINVALUE) TO (’b’, MINVALUE), принимает любые строки, в которых первый столбец ключа разбиения начинается с «a».

Обратите внимание, что если MINVALUE или MAXVALUE используется для одного столбца границы партиции, то это же значение должно использоваться для всех последующих столбцов. Например, (10, MINVALUE, 0) не является допустимой границей; следует написать (10, MINVALUE, MINVALUE).

Также обратите внимание, что у некоторых типов элементов, таких как timestamp (отметка времени), есть понятие «infinity» (бесконечность), которое является просто еще одним сохраняемым значением. Оно отличается от MINVALUE и MAXVALUE, являющимися не реальными значениями, которые могут быть сохранены, а скорее способами сказать, что значение безгранично. MAXVALUE можно рассматривать как значение, превышающее любое другое, включая «бесконечность», а MINVALUE — как значение меньше любого другого, включая «минус бесконечность». Таким образом, диапазон FROM ('infinity') TO (MAXVALUE) — это не пустой диапазон; он позволяет хранить ровно одно значение — «infinity».

Если указывается DEFAULT, то таблица будет создана как партиция по умолчанию родительской таблицы. Этот параметр недоступен для хэш-партиционированных таблиц. Значение ключа разбиения, не вписывающееся в любую другую партицию данного родительского объекта, будет перенаправлено в партицию по умолчанию.

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

При создании хэш-партиции необходимо указать модуль и остаток. Модуль должен быть положительным целым числом, а остаток — неотрицательным целым числом меньше модуля. Как правило, при первоначальной настройке хэш-партиционированной таблицы следует выбрать модуль, равный числу партиций, и назначить каждой таблице этот модуль и разные остатки (см. примеры ниже). Однако партициям необязательно иметь одинаковый модуль, достаточно чтобы каждый модуль, который встречается среди партиций хэш-партиционированной таблицы, был кратным следующего большего модуля. Это позволяет постепенно увеличивать число партиций без необходимости перемещать все данные одновременно. Например, предположим, что у вас есть хэш-партиционированная таблица с 8 партициями, каждая из которых имеет модуль 8, но необходимо увеличить число партиций до 16. Можно отсоединить одну из партиций по модулю 8, создать две новые партиции по модулю 16, охватывающие ту же часть пространства ключей (одну с остатком, равным остатку отсоединенной партиции, а другую с остатком, равным этому значению плюс 8), и повторно заполнить их данными. Затем этот процесс можно повторить — возможно, позднее — для каждой партиции по модулю 8, пока ни одной из них не останется. Хотя такой способ по-прежнему может включать в себя большой объем перемещения данных на каждом этапе, это всё же лучше, чем создавать целую новую таблицу и перемещать все данные сразу.

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

Строки, добавленные в партиционированную таблицу, будут автоматически перенаправлены в нужную партицию. Если подходящей партиции не существует, произойдет ошибка.

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

LIKE исходная_таблица [ вариант_копирования ... ]

Предложение LIKE указывает таблицу, из которой новая таблица автоматически копирует все имена столбцов, их типы данных и их ограничения на значение NULL.

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

Также, в отличие от INHERITS, столбцы и ограничения, скопированные при помощи LIKE, не объединяются с одноименными столбцами и ограничениями. Если одно и то же имя указано явно или содержится в другом предложении LIKE, будет выдана ошибка.

Необязательные предложения вариант_копирования указывают, какие дополнительные свойства исходной таблицы следует скопировать. Указание INCLUDING копирует свойство, указание EXCLUDING опускает свойство. EXCLUDING — это значение по умолчанию. Если для одного и того же типа объекта создается несколько спецификаций, то используется последняя из них. Доступные варианты:

INCLUDING COMMENTS

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

INCLUDING CONSTRAINTS

Будут скопированы ограничения CHECK. Между ограничениями столбцов и таблиц никакого различия не делается. Ограничения на NULL всегда копируются в новую таблицу.

INCLUDING DEFAULTS

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

INCLUDING GENERATED

Будут скопированы все выражения генерации скопированных определений столбцов. По умолчанию новые столбцы будут обычными базовыми столбцами.

INCLUDING IDENTITY

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

INCLUDING INDEXES

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

INCLUDING STATISTICS

Расширенная статистика копируется в новую таблицу.

INCLUDING STORAGE

Будут скопированы параметры STORAGE для скопированных определений столбцов. Поведением по умолчанию является исключение параметров STORAGE, в результате чего скопированные столбцы в новой таблице имеют параметры по умолчанию для конкретного типа. Дополнительную информацию о параметрах STORAGE см. в разделе TOAST.

INCLUDING ALL

INCLUDING ALL — это сокращенная форма выбора всех доступных индивидуальных настроек. (Может быть удобно после применения INCLUDING ALL написать отдельные предложения EXCLUDING, чтобы выбрать все, кроме некоторых конкретных параметров.)

Предложение LIKE также можно использовать для копирования определений столбцов из представлений, сторонних таблиц или составных типов. Неприменимые настройки (например, INCLUDING INDEXES из представления) игнорируются.

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

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

NOT NULL

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

NULL

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

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

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

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

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

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

Когда таблица имеет несколько ограничений CHECK, они будут проверяться для каждой строки в алфавитном порядке по имени после проверки ограничений NOT NULL.

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

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

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

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

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

Ключевое слово STORED требуется для обозначения того, что столбец будет вычислен при записи и сохранен на диске.

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

GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( параметры_последовательности ) ]

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

Предложения ALWAYS и BY DEFAULT определяют, каким образом значение последовательности имеет приоритет над пользовательским значением в операторе INSERT. Если задано значение ALWAYS, пользовательское значение принимается только в том случае, если в операторе INSERT указано VERRIDING SYSTEM VALUE. Если указано BY DEFAULT, то пользовательское значение имеет приоритет. Дополнительную информацию см. в разделе INSERT. (В команде COPY всегда используются пользовательские значения, независимо от этого параметра.)

Необязательное предложение параметры_последовательности можно использовать для переопределения параметров последовательности. Дополнительную информацию см. в разделе CREATE SEQUENCE.

UNIQUE (ограничение столбца) UNIQUE ( имя_столбца [, ... ] ) [ INCLUDE ( имя_столбца [, ...]) ] (ограничение таблицы)

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

При проверке ограничения уникальности значения NULL не считаются равными.

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

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

Добавление ограничения уникальности автоматически создаст уникальный индекс типа В-дерево для столбца или группы столбцов, используемых в ограничении. Необязательное предложение INCLUDE добавляет к этому индексу один или несколько столбцов, для которых не применяется уникальность. Обратите внимание, что хотя ограничение не применяется к включенным столбцам, оно всё равно зависит от них. Следовательно, некоторые операции над этими столбцами (например, DROP COLUMN) могут вызвать каскадное ограничение и удаление индекса.

PRIMARY KEY (ограничение столбца) PRIMARY KEY ( имя_столбца [, ... ] ) [ INCLUDE ( имя_столбца [, ...]) ] (ограничение таблицы)

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

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

PRIMARY KEY принудительно применяет те же ограничения данных, что и комбинация UNIQUE и NOT NULL, но указание набора столбцов в качестве первичного ключа также предоставляет метаданные о конструкции схемы, поскольку первичный ключ подразумевает, что другие таблицы могут полагаться на этот набор столбцов в качестве уникального идентификатора для строк.

Ограничения PRIMARY KEY разделяют условия, которые имеют ограничения UNIQUE при размещении в партиционированных таблицах.

Добавление ограничения PRIMARY KEY автоматически создаст уникальный индекс типа B-дерево для столбца или группы столбцов, используемых в ограничении. Необязательное предложение INCLUDE позволяет указать список столбцов, которые будут включены в неключевую часть индекса. Хотя уникальность не применяется к включенным столбцам, ограничение всё равно зависит от них. Следовательно, некоторые операции над включенными столбцами (например, DROP COLUMN) могут вызвать каскадное ограничение и удаление индекса.

EXCLUDE [ USING индексный_метод ] ( элемент_исключения WITH оператор [, ... ] ) параметры_индекса [ WHERE ( предикат ) ]

Предложение EXCLUDE определяет ограничение исключения, которое гарантирует, что если любые две строки сравниваются на указанном столбце(ах) или выражении(ях) с использованием указанного оператора(ов), не все эти сравнения вернут значение TRUE. Если все указанные операторы проверяются на равенство, это эквивалентно ограничению UNIQUE, хотя обычное ограничение уникальности будет быстрее. Однако ограничения исключения могут указывать на ограничения, которые являются более общими, чем простое равенство. Например, можно указать ограничение, что никакие две строки в таблице не содержат перекрывающихся кругов (см. Геометрические типы), используя оператор &&.

Ограничения исключения реализуются с помощью индекса, поэтому каждый указанный оператор должен быть связан с соответствующим классом оператора (см. раздел Классы операторов и семейства операторов) для метода доступа к индексу индексный_метод. Операторы должны быть коммутативными. В каждом элементе_исключения можно дополнительно указать класс оператора и/или параметры сортировки; они полностью описаны в разделе CREATE INDEX.

Метод доступа должен поддерживать amgettuple (см. главу Определение интерфейса метода доступа к индексу); в настоящее время это означает, что GIN использовать нельзя. Хотя это разрешено, нет особого смысла в использовании с ограничением исключения B-дерева или хэш-индексов, потому что это ничуть не лучше, чем обычное ограничение уникальности. Поэтому на практике метод доступа всегда будет GiST или SP-GiST.

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

REFERENCES ссылочная_таблица [ ( ссылочный_столбец ) ] [ MATCH тип_совпадения ] [ ON DELETE ссылочное_действие ] [ ON UPDATE ссылочное_действие ] (ограничение столбца) FOREIGN KEY ( имя_столбца [, ...\ ] ) REFERENCES ссылочная_таблица [ ( ссылочный_столбец [, ... ] ) ] [ MATCH тип_совпадения ] [ ON DELETE ссылочное_действие ] [ ON UPDATE ссылочное_действие ] (ограничение таблицы)

Эти предложения задают ограничение внешнего ключа, которое требует, чтобы группа из одного или нескольких столбцов новой таблицы содержала только значения, соответствующие значениям в ссылочном(ых) столбце(ах) некоторых строк ссылочной таблицы. Если список ссылочных_столбцов опущен, в качестве него будет использован первичный ключ ссылочной_таблицы. Ссылочные столбцы должны быть столбцами неоткладываемого ограничения уникальности или первичного ключа в ссылочной таблице. Необходимо иметь разрешение REFERENCES на эту ссылочную таблицу (либо на всю таблицу, либо на конкретные ссылочные столбцы). Добавление ограничения внешнего ключа требует блокировки SHARE ROW EXCLUSIVE соответствующей ссылочной таблицы. Обратите внимание, что ограничения внешнего ключа нельзя определить между временными и постоянными таблицами.

Значение, добавленное в ссылочный(ые) столбец(цы), сопоставляется со значениями ссылочной таблицы и ссылочных столбцов с использованием заданного типа соответствия. Существует три типа соответствия: MATCH FULL, MATCH PARTIAL и MATCH SIMPLE (что является значением по умолчанию). MATCH FULL не допускает, чтобы один столбец многоколоночного внешнего ключа имел значение NULL, если только все столбцы внешнего ключа не имеют значения NULL; если все они имеют значение NULL, то строка не обязательно должна совпадать в указанной таблице. MATCH SIMPLE позволяет любому из столбцов внешнего ключа иметь значение NULL; если какой-либо из них имеет значение NULL, строка не обязательно должна совпадать в ссылочной таблице. MATCH PARTIAL пока не реализовано. (Разумеется, для предотвращения возникновения подобных случаев к ссылочному(ым) столбцу(ам) могут быть применены ограничения NOT NULL.)

Кроме того, при изменении данных в ссылочных столбцах выполняются определенные действия с данными в столбцах этой таблицы. Предложение ON DELETE указывает действие, которое необходимо выполнить при удалении ссылочной строки в ссылочной таблице. Аналогичным образом предложение ON UPDATE указывает действие, которое необходимо выполнить, когда ссылочный столбец в ссылочной таблице обновляется до нового значения. Если строка обновляется, но ссылочный столбец фактически не изменяется, никакие действия не выполняются. Ссылочные действия, отличные от NO ACTION, нельзя сделать откладываемыми, даже если ограничение объявлено отложенным. Для каждого предложения возможны следующие действия:

NO ACTION

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

RESTRICT

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

CASCADE

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

SET NULL

Установить для ссылочных столбцов значение NULL.

SET DEFAULT

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

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

DEFERRABLE NOT DEFERRABLE

Это предложение определяет, может ли ограничение быть отложено. Неоткладываемое ограничение будет проверяться сразу же после выполнения каждой команды. Проверка откладываемых ограничений может быть отсрочена до окончания транзакции (с помощью команды SET CONSTRAINTS). NOT DEFERRABLE является значением по умолчанию. В настоящее время только ограничения UNIQU, PRIMARY KEY, EXCLUDE и REFERENCES (внешний ключ) принимают это предложение. Ограничения NOT NULL и CHECK являются неоткладываемыми. Обратите внимание, что откладываемые ограничения нельзя использовать в качестве арбитраторов конфликтов в операторе INSERT, который включает в себя предложение ON CONFLICT DO UPDATE.

INITIALLY IMMEDIATE INITIALLY DEFERRED

Если ограничение является откладываемым, это предложение указывает время по умолчанию для проверки ограничения. Ограничение с характеристикой INITIALLY IMMEDIATE проверяется после каждого оператора. Это значение по умолчанию. Ограничение с характеристикой INITIALLY DEFERRED проверяется только в конце транзакции. Время проверки ограничений можно изменить с помощью команды SET CONSTRAINTS.

USING метод

Это необязательное предложение определяет метод доступа к таблице, который будет использоваться для хранения содержимого для новой таблицы; этот метод должен быть типа TABLE.
Дополнительную информацию см. в главе Определение интерфейса метода доступа к таблице.

Если этот параметр не указан, то для новой таблицы выбирается метод доступа к таблице по умолчанию.
Дополнительную информацию см. в разделе default_table_access_method.

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

Также в QHB реализован встроенный метод доступа, реализующий хранилище append_only, для которого характерны следующие свойства:

  • Запрещена модификация данных (update и delete).
  • Осуществляется максимально быстрая вставка данных.
  • Отсутствует необходимость в автоочистке.
  • Поддерживаются все типы индексов.
  • Для удаления старых данных можно использовать секционирование таблицы и удалять данные секциями, либо использовать команду TRUNCATE.
  • Не поддерживается механизм TOAST.

Дополнительную информацию см. в разделе Таблицы APPEND_ONLY.

WITH ( параметр_хранения [= значение] [, ... ] )

В этом предложении указываются необязательные параметры хранения для таблицы или индекса; дополнительную информацию см. в подразделе Параметры хранения. Для обратной совместимости предложение WITH для таблицы также может включать в себя условие OIDS=FALSE, чтобы указать, что строки новой таблицы не должны содержать OID (идентификаторы объектов); OIDS=TRUE не поддерживается.

WITHOUT OIDS

Это синтаксис обратной совместимости для объявления таблицы WITHOUT OIDS; создание таблицы WITH OIDS не поддерживается.

ON COMMIT

Поведение временных таблиц в конце блока транзакций можно контролировать с помощью ON COMMIT. Есть три варианта:

  • PRESERVE ROWS

Никаких специальных действий по завершению транзакций не предпринимается. Это поведение по умолчанию.

  • DELETE ROWS

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

  • DROP

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

TABLESPACE имя_табличного_пространства

имя_табличного_пространства — это имя табличного пространства, в котором будет создана новая таблица. Если этот параметр не указан, выполняется запрос default_tablespace или temp_tablespaces (если таблица временная). Для партиционированных таблиц, поскольку для самой таблицы хранение не требуется, указанное табличное пространство переопределяет default_tablespace как табличное пространство по умолчанию, используемое для любых вновь созданных партиций, когда никакое другое табличное пространство явно не указано.

USING INDEX TABLESPACE имя_табличного_пространства

Это предложение позволяет выбрать табличное пространство, в котором будет создан индекс, связанный с ограничением UNIQUE, PRIMARY KEY или EXCLUDE. Если этот параметр не указан, выполняется запрос default_tablespace или temp_tablespaces (если таблица временная).

Параметры хранения

Предложение WITH может указывать параметры хранения для таблиц, а также для индексов, связанных с ограничениями UNIQUE, PRIMARY KEY или EXCLUDE. Параметры хранения для индексов описаны в разделе CREATE INDEX. Ниже перечислены параметры хранения, доступные в настоящее время для таблиц. Для многих из этих параметров, как показано, существует дополнительный параметр с тем же именем, префиксом которого является toast., который управляет поведением вторичной таблицы TOAST, если таковая имеется (дополнительную информацию о таких таблицах см. в разделе TOAST). Если установлено значение параметра таблицы, а и аналогичный параметр toast. не определен, таблица TOAST будет использовать значение параметра таблицы. Указание этих параметров для партиционированных таблиц не поддерживается, но их можно задать для отдельных конечных партиций.

fillfactor (integer)

Коэффициент заполнения для таблицы, задается в процентах от 10 до 100. Значение по умолчанию равно 100 (полное заполнение). Если указан меньший коэффициент заполнения, то операции добавления упаковывают страницы таблицы только до указанного процента; оставшееся пространство на каждой странице зарезервировано для изменения строк на этой странице. Это дает UPDATE возможность разместить измененную копию строки на той же странице, что и оригинал, что более эффективно, чем размещение его на другой странице. Для таблицы, записи которой никогда не обновляются, лучшим выбором является полное заполнение, но в активно обновляемых таблицах целесообразнее использовать более мелкие коэффициенты заполнения. Этот параметр нельзя задать для таблиц TOAST.

toast_tuple_target (integer)

toast_tuple_target задает минимальную необходимую длину кортежа, после превышения которой мы попытаемся сжать и/или переместить значения длинных столбцов в таблицы TOAST, а также целевое значение, до которого мы попытаемся уменьшить нижележащую длину после перехода к TOAST. Это касается столбцов, помеченных как External (внешние, которые могут переноситься), Main (основные, которые могут сжиматься) или Extended (расширенные, которые могут как сжиматься, так и просто переноситься) и применяется только к новым кортежам. На существующие строки это не влияет. По умолчанию значение этого параметра допускает размещение не менее 4 кортежей на блок, что при стандартном размере блока составляет 2040 байт. Допустимые значения находятся в диапазоне от 128 байт до (размер блока — заголовок), по умолчанию 8160 байт. Изменение этого значения может быть не очень полезно для слишком коротких или слишком длинных строк. Обратите внимание, что настройка по умолчанию часто близка к оптимальной, и вполне возможно, что перенастройка этого параметра в некоторых случаях может иметь негативные последствия. Этот параметр нельзя задать для таблиц TOAST.

parallel_workers (integer)

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

autovacuum_enabled, toast.autovacuum_enabled (boolean)

Включает или отключает процесс «Автовакуум» для определенной таблицы. Если задано значение true, то процесс «Автовакуум» будет выполнять в этой таблице автоматические операции VACUUM и/или ANALYZE, следуя правилам, описанным в разделе Процесс «Автовакуум». Если значение равно false, эта таблица не будет подвергнута автоочистке, за исключением случаев, когда необходимо предотвратить зацикливание идентификатора транзакции. Дополнительную информацию о предотвращении зацикливания см. в разделе Предотвращение ошибок зацикливания идентификатора транзакции. Обратите внимание, что процесс «Автовакуум» не запускается вообще (кроме как для предотвращения обхода идентификатора транзакции), если параметр autovacuum имеет значение false; установка параметров хранения для отдельных таблиц это не переопределяет. Поэтому явно задавать этому параметру хранения значение true не имеет особого смысла — полезно только значение false.

vacuum_index_cleanup, toast.vacuum_index_cleanup (boolean)

Включает или отключает очистку индекса при выполнении команды VACUUM в этой таблице. Значение по умолчанию равно true. Отключение очистки индекса может значительно ускорить выполнение VACUUM, но также может привести к появлению сильно «раздутых» индексов, если изменения таблицы происходят часто. Параметр INDEX_CLEANUP команды VACUUM, если он указан, переопределяет значение этого параметра.

vacuum_truncate, toast.vacuum_truncate (boolean)

Включает или отключает очистку, чтобы попытаться провести усечение всех пустых страниц в конце этой таблицы. Значение по умолчанию равно true. При значении true VACUUM и автоочистка делают усечение, и дисковое пространство для усеченных страниц возвращается в операционную систему. Обратите внимание, что для усечения требуется блокировка ACCESS EXCLUSIVE для таблицы. Явно указанный параметр TRUNCATE команды VACUUM переопределяет значение этого параметра.

autovacuum_vacuum_threshold, toast.autovacuum_vacuum_threshold (integer)

Значение параметра autovacuum_vacuum_threshold для таблицы.

autovacuum_vacuum_scale_factor, toast.autovacuum_vacuum_scale_factor (floating point)

Значение параметра autovacuum_vacuum_scale_factor для таблицы.

autovacuum_vacuum_insert_threshold, toast.autovacuum_vacuum_insert_threshold (integer)

Значение параметра autovacuum_vacuum_insert_threshold для таблицы. Для отключения очистки, вызываемой добавлением данных в таблицу, можно применить специальное значение -1.

autovacuum_vacuum_insert_scale_factor, toast.autovacuum_vacuum_insert_scale_factor (floating point)

Значение параметра autovacuum_vacuum_insert_scale_factor для таблицы.

autovacuum_analyze_threshold (integer)

Значение параметра autovacuum_analyze_threshold для таблицы.

autovacuum_analyze_scale_factor (floating point)

Значение параметра autovacuum_analyze_scale_factor для таблицы.

autovacuum_vacuum_cost_delay, toast.autovacuum_vacuum_cost_delay (floating point)

Значение параметра autovacuum_vacuum_cost_delay для таблицы.

autovacuum_vacuum_cost_limit, toast.autovacuum_vacuum_cost_limit (integer)

Значение параметра autovacuum_vacuum_cost_limit для таблицы.

autovacuum_freeze_min_age, toast.autovacuum_freeze_min_age (integer)

Значение параметра [vacuum_freeze_min_age] для таблицы. Обратите внимание, что автоочистка будет игнорировать табличные параметры autovacuum_freeze_min_age, превышающие половину значения общесистемного параметра autovacuum_freeze_max_age.

autovacuum_freeze_max_age, toast.autovacuum_freeze_max_age (integer)

Значение параметра autovacuum_freeze_max_age для таблицы. Обратите внимание, что автоочистка будет игнорировать табличные параметры autovacuum_freeze_max_age, превышающие значение общесистемного параметра (они могут быть установлены только меньше).

autovacuum_freeze_table_age, toast.autovacuum_freeze_table_age (integer)

Значение параметра [vacuum_freeze_table_age] для таблицы.

autovacuum_multixact_freeze_min_age, toast.autovacuum_multixact_freeze_min_age (integer)

Значение параметра vacuum_multixact_freeze_min_age для таблицы. Обратите внимание, что автоочистка будет игнорировать табличные параметры autovacuum_multixact_freeze_min_age, превышающие половину значения общесистемного параметра autovacuum_multixact_freeze_max_age.

autovacuum_multixact_freeze_max_age, toast.autovacuum_multixact_freeze_max_age (integer)

Значение параметра autovacuum_multixact_freeze_max_age для таблицы. Обратите внимание, что автоочистка будет игнорировать табличные параметры autovacuum_multixact_freeze_max_age, превышающие значение общесистемного параметра (они могут быть установлены только меньше).

autovacuum_multixact_freeze_table_age, toast.autovacuum_multixact_freeze_table_age (integer)

Значение параметра vacuum_multixact_freeze_table_age для таблицы.

log_autovacuum_min_duration, toast.log_autovacuum_min_duration (integer)

Значение параметра log_autovacuum_min_duration для таблицы.

user_catalog_table (boolean)

Объявить таблицу дополнительной таблицей каталога в целях логической репликации. Этот параметр нельзя задать для таблиц TOAST.

holdmem (OFF, POSSIBLY, ONLY)

Параметр указывающий что для таблицы будет использоваться особый кеш дисковых блоков. Подробнее см. Параметр HOLDMEM и дополнительные кешы дисковых блоков.

Примечания

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

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

Таблица не может иметь более 1600 столбцов. (На практике эффективный предел обычно ниже из-за ограничений длины кортежа.)

Примеры

Создание таблиц films и distributors:

CREATE TABLE films (
    code        char(5) CONSTRAINT firstkey PRIMARY KEY,
    title       varchar(40) NOT NULL,
    did         integer NOT NULL,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute
);

CREATE TABLE distributors (
     did    integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
     name   varchar(40) NOT NULL CHECK (name<> '')
);

Создание таблицы с двумерным массивом:

CREATE TABLE array_int (
    vector  int[][]
);

Определение ограничения уникальности таблицы для таблицы films. Ограничения уникальности таблицы могут быть определены для одного или нескольких столбцов таблицы:

CREATE TABLE films (
    code        char(5),
    title       varchar(40),
    did         integer,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute,
    CONSTRAINT production UNIQUE(date_prod)
);

Определение ограничения-теста для столбца:

CREATE TABLE distributors (
    did     integer CHECK (did > 100),
    name    varchar(40)
);

Определение ограничения-теста для таблицы:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40),
    CONSTRAINT con1 CHECK (did > 100 AND name<> '')
);

Определение ограничения первичного ключа для таблицы films:

CREATE TABLE films (
    code        char(5),
    title       varchar(40),
    did         integer,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute,
    CONSTRAINT code_title PRIMARY KEY(code,title)
);

Определение ограничения первичного ключа для таблицы distributors. Следующие два примера равнозначны: первый использует синтаксис ограничения для таблицы, а второй — для столбца:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40),
    PRIMARY KEY(did)
);

CREATE TABLE distributors (
    did     integer PRIMARY KEY,
    name    varchar(40)
);

Установка значений по умолчанию: для столбца name это литерная константа, для столбца did оно генерируется путем выбора следующего значения объекта последовательности, для modtime это время добавления строки:

CREATE TABLE distributors (
    name      varchar(40) DEFAULT 'Luso Films',
    did       integer DEFAULT nextval('distributors_serial'),
    modtime   timestamp DEFAULT current_timestamp
);

Определение двух ограничений NOT NULL для столбцов в таблице distributors, одному из которых явно дано имя:

CREATE TABLE distributors (
    did     integer CONSTRAINT no_null NOT NULL,
    name    varchar(40) NOT NULL
);

Определение ограничения уникальности для столбца name:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40) UNIQUE
);

То же самое, указанное в качестве ограничения для таблицы:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40),
    UNIQUE(name)
);

Создание той же таблицы с указанием коэффициента заполнения 70% как для самой таблицы, так и для ее уникального индекса:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40),
    UNIQUE(name) WITH (fillfactor=70)
)
WITH (fillfactor=70);

Создание таблицы circles с ограничением исключения, которое предотвращает перекрытие любых двух кругов:

CREATE TABLE circles (
    c circle,
    EXCLUDE USING gist (c WITH &&)
);

Создание таблицы cinemas в табличном пространстве diskvol1:

CREATE TABLE cinemas (
        id serial,
        name text,
        location text
) TABLESPACE diskvol1;

Создание составного типа и типизированной таблицы:

CREATE TYPE employee_type AS (name text, salary numeric);

CREATE TABLE employees OF employee_type (
    PRIMARY KEY (name),
    salary WITH OPTIONS DEFAULT 1000
);

Создание таблицы, партиционированной по диапазонам:

CREATE TABLE measurement (
    logdate         date not null,
    peaktemp        int,
    unitsales       int
) PARTITION BY RANGE (logdate);

Создание таблицы, партиционированной по диапазонам, с несколькими столбцами в ключе разбиения:

CREATE TABLE measurement_year_month (
    logdate         date not null,
    peaktemp        int,
    unitsales       int
) PARTITION BY RANGE (EXTRACT(YEAR FROM logdate), EXTRACT(MONTH FROM logdate));

Создание таблицы, партиционированной по списку:

CREATE TABLE cities (
    city_id      bigserial not null,
    name         text not null,
    population   bigint
) PARTITION BY LIST (left(lower(name), 1));

Создание хэш-партиционированной таблицы:

CREATE TABLE orders (
    order_id     bigint not null,
    cust_id      bigint not null,
    status       text
) PARTITION BY HASH (order_id);

Создание партиции таблицы, партиционированной по диапазонам:

CREATE TABLE measurement_y2016m07
    PARTITION OF measurement (
    unitsales DEFAULT 0
) FOR VALUES FROM ('2016-07-01') TO ('2016-08-01');

Создание нескольких партиций таблицы, партиционированной по диапазонам, с несколькими столбцами в ключе разбиения:

CREATE TABLE measurement_ym_older
    PARTITION OF measurement_year_month
    FOR VALUES FROM (MINVALUE, MINVALUE) TO (2016, 11);

CREATE TABLE measurement_ym_y2016m11
    PARTITION OF measurement_year_month
    FOR VALUES FROM (2016, 11) TO (2016, 12);

CREATE TABLE measurement_ym_y2016m12
    PARTITION OF measurement_year_month
    FOR VALUES FROM (2016, 12) TO (2017, 01);

CREATE TABLE measurement_ym_y2017m01
    PARTITION OF measurement_year_month
    FOR VALUES FROM (2017, 01) TO (2017, 02);

Создание партиции таблицы со списочным партиционированием:

CREATE TABLE cities_ab
    PARTITION OF cities (
    CONSTRAINT city_id_nonzero CHECK (city_id != 0)
) FOR VALUES IN ('a', 'b');

Создание партиции таблицы со списочным партиционированием, которая сама в дальнейшем партиционируется, а затем добавление в нее партиции:

CREATE TABLE cities_ab
    PARTITION OF cities (
    CONSTRAINT city_id_nonzero CHECK (city_id != 0)
) FOR VALUES IN ('a', 'b') PARTITION BY RANGE (population);

CREATE TABLE cities_ab_10000_to_100000
    PARTITION OF cities_ab FOR VALUES FROM (10000) TO (100000);

Создание партиций хэш-партиционированной таблицы:

CREATE TABLE orders_p1 PARTITION OF orders
    FOR VALUES WITH (MODULUS 4, REMAINDER 0);
CREATE TABLE orders_p2 PARTITION OF orders
    FOR VALUES WITH (MODULUS 4, REMAINDER 1);
CREATE TABLE orders_p3 PARTITION OF orders
    FOR VALUES WITH (MODULUS 4, REMAINDER 2);
CREATE TABLE orders_p4 PARTITION OF orders
    FOR VALUES WITH (MODULUS 4, REMAINDER 3);

Создание партиции по умолчанию:

CREATE TABLE cities_partdef
    PARTITION OF cities DEFAULT;

Совместимость

Команда CREATE TABLE соответствует стандарту SQL с исключениями, указанными ниже.

Временная таблица

Хотя синтаксис CREATE TEMPORARY TABLE похож на тот, что имеется в стандарте SQL, их действие неодинаково. В стандарте временные таблицы определяются только один раз и автоматически существуют (начиная с пустого содержимого) в каждом сеансе, который нуждается в них. QHB вместо этого требует, чтобы каждый сеанс выдавал для каждой используемой временной таблицы свою собственную команду CREATE TEMPORARY TABLE. Это позволяет различным сеансам использовать одно и то же имя временной таблицы для различных целей, в то время как подход стандарта ограничивает все экземпляры данного имени временной таблицы одной и той же структурой таблицы.

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

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

Для обеспечения совместимости QHB принимает в объявлении временной таблицы ключевые слова GLOBAL и LOCAL, но в настоящее время они не имеют никакого эффекта. Использование этих ключевых слов не рекомендуется, так как будущие версии QHB могут принять более стандартную интерпретацию их значения.

Предложение ON COMMIT для временных таблиц также напоминает стандарт SQL, но имеет некоторые отличия. Если предложение ON COMMIT опущено, SQL указывает, что поведением по умолчанию является ON COMMIT DELETE ROWS. Однако в QHB поведением по умолчанию является ON COMMIT PRESERVE ROWS. Параметра ON COMMIT DROP в SQL не существует.

Неотложные ограничения уникальности

Когда ограничение UNIQUE или PRIMARY KEY не является откладываемым, QHB проверяет уникальность непосредственно в момент добавления или изменения строки. Стандарт SQL говорит, что уникальность должна быть применена только в конце оператора; это имеет значение, когда, например, одна команда изменяет множество ключевых значений. Чтобы получить поведение, соответствующее стандарту, объявите ограничение как DEFERRABLE (откладываемое), но не отложенное (т. е. INITIALLY IMMEDIATE). Имейте в виду, что это может быть значительно медленнее, чем немедленная проверка уникальности.

Ограничения-тесты для столбцов

В стандарте SQL говорится, что ограничения CHECK для столбца могут ссылаться только на столбец, к которому они применяются; только ограничения CHECK для таблицы могут ссылаться на множество столбцов. QHB не применяет это условие; он обрабатывает ограничения-тесты столбцов и таблиц одинаково.

Ограничение EXCLUDE

Ограничение EXCLUDE является расширением QHB.

«Ограничение» NULL

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

Ограничение именования

Стандарт SQL говорит, что ограничения таблицы и домена должны иметь имена, которые являются уникальными в схеме, содержащей таблицу или домен. QHB в этом плане либеральнее: он требует только, чтобы имена были уникальными среди ограничений, прикрепленных к определенной таблице или домену. Однако эта дополнительная свобода не существует для ограничений на основе индексов (ограничения UNIQUE, PRIMARY KEY и EXCLUDE), поскольку связанный индекс имеет то же имя, что и ограничение, а имена индексов должны быть уникальными во всех отношениях в пределах одной схемы.

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

Наследование

Множественное наследование через предложение INHERITS является языковым расширением QHB. SQL:1999 и более поздние версии определяют одиночное наследование, используя другой синтаксис и другую семантику. Наследование стиля SQL:1999 в QHB пока еще не поддерживается.

Таблицы с нулевыми столбцами

QHB позволяет создавать таблицу без столбцов (например, CREATE TABLE foo();). Это расширение от стандарта SQL, который не позволяет таблицы с нулевыми столбцами. Таблицы с нулевыми столбцами сами по себе не очень полезны, но их запрещение создает специальные случаи для ALTER TABLE DROP COLUMN, поэтому кажется более правильным игнорировать это ограничение стандарта.

Множество столбцов идентификаторов

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

Генерируемые столбцы

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

Предложение LIKE

Хотя предложение LIKE и существует в стандарте SQL, многие параметры, которые принимает для него QHB, не входят в стандарт, и наоборот, некоторые параметры стандарта не реализуются в QHB.

Предложение USING qss

Предложение USING с методом qss. является расширением QHB.

Предложение USING append_only

Предложение USING с методом append_only является расширением QHB.

Предложение WITH

Предложение WITH является расширением QHB; параметры хранения не входят в стандарт.

TABLESPACE

Концепция табличных пространств QHB не является частью стандарта. Следовательно, пункты TABLESPACE и USING INDEX TABLESPACE являются расширениями.

Типизированная таблица

Типизированные таблицы реализуют подмножество стандарта SQL. Согласно стандарту, типизированная таблица имеет столбцы, соответствующие базовому составному типу, а также еще один столбец, который является «самоссылающимся столбцом». QHB явно не поддерживает столбцы, ссылающиеся на себя.

Предложение PARTITION BY

Предложение PARTITION BY является расширением QHB.

Предложение PARTITION OF

Предложение PARTITION OF является расширением QHB.

См. также

ALTER TABLE, DROP TABLE, CREATE TABLE AS, CREATE TABLESPACE, CREATE TYPE