CREATE TABLE

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


Синтаксис

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] имя_таблицы ( [
  { имя_столбца тип_данных [ COMPRESSION метод_сжатия ] [ 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 это не имеет никакого значения и считается устаревшим; см. параграф Совместимость ниже.

UNLOGGED

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

IF NOT EXISTS

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

имя_таблицы

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

OF имя_типа

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

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

имя_столбца

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

тип_данных

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

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

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

COMPRESSION метод_сжатия

Предложение COMPRESSION устанавливает метод сжатия для столбца. Сжатие поддерживается только для типов данных переменной длины и используется, только когда столбец имеет режим хранения main или extended. (Информацию о режимах хранения столбцов см. на справочной странице команды ALTER TABLE.) Установка этого свойства для партиционированной таблицы не имеет прямого эффекта, поскольку такие таблицы сами по себе не имеют хранимых данных, но сконфигурированное значение будет унаследовано их вновь создаваемыми партициями. Поддерживаемые методы сжатия: pglz и lz4. (lz4 доступен, только если при сборке QHB был использован ключ --with-lz4.) Кроме того, метод_сжатия может иметь значение default, явно задающее поведение по умолчанию — когда используемый метод определяется значением параметра default_toast_compression во время добавления данных.

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 задает таблицу, из которой новая таблица автоматически копирует все имена столбцов, их типы данных и их ограничения NOT NULL.

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

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

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

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

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

  • INCLUDING CONSTRAINTS
    Будут скопированы ограничения CHECK. Между ограничениями столбцов и таблиц никакого различия не делается. Ограничения NOT 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 [ ( параметры_последовательности ) ]

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

Предложения ALWAYS и BY DEFAULT определяют, насколько явно заданные пользователем значения обрабатываются в командах INSERT и UPDATE.

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

В команде UPDATE при выборе ALWAYS любая попытка заменить содержимое столбца на любое значение, отличное от DEFAULT, будет отвергнута. При выборе BY DEFAULT столбец можно изменить как обычно. (Предложение OVERRIDING для команды UPDATE отсутствует.)

Необязательное предложение параметры_последовательности можно использовать для переопределения параметров последовательности. Дополнительную информацию см. на справочной странице команды 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, для которого характерны следующие свойства:

  • Запрещена модификация данных (изменение и удаление).
  • Осуществляется максимально быстрая вставка данных.
  • Отсутствует необходимость в автоочистке.
  • Поддерживаются все типы индексов.
  • Для удаления старых данных можно использовать партиционирование таблицы и удалять данные партициями либо использовать команду 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 (полное заполнение). Если указан меньший коэффициент заполнения, то операции INSERT заполняют страницы таблицы только до указанного процента; оставшееся пространство на каждой странице резервируется для изменения строк на этой странице. Это дает 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 в этой таблице. Значение по умолчанию равно AUTO. Со значением OFF очистка индекса выключается, с ON — включается, а с AUTO решение принимается динамически при каждом запуске VACUUM. Это динамическое поведение позволяет VACUUM избегать ненужного сканирования индексов, чтобы удалить лишь несколько неактивных кортежей. Принудительное полное выключение очистки индекса может значительно ускорить выполнение 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 опущено, в стандарте указано, что поведением по умолчанию является 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; параметры хранения не входят в стандарт.

Табличные пространства

Концепция табличных пространств 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