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
, qss