CREATE TABLE
CREATE TABLE — определить новую таблицу
Синтаксис
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] имя_таблицы ( [
{ имя_столбца тип_данных [ STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ] [ COMPRESSION метод_сжатия ] [ COLLATE правило_сортировки ] [ ограничение_столбца [ ... ] ]
| ограничение_таблицы
| LIKE исходная_таблица [ параметр_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 [ NULLS [ NOT ] DISTINCT ] параметры_индекса |
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 [ NULLS [ NOT ] DISTINCT ] ( имя_столбца [, ... ] ) параметры_индекса |
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 | COMPRESSION | 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 является:
{ имя_столбца | ( выражение ) } [ COLLATE правило_сортировки ] [ класс_операторов [ ( параметр_класса_операторов = значение [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]
ссылочным_действием в ограничении FOREIGN KEY/REFERENCES является:
{ NO ACTION | RESTRICT | CASCADE | SET NULL [ ( имя_столбца [, ... ] ) ] | SET DEFAULT [ ( имя_столбца [, ... ] ) ] }
Описание
Команда CREATE TABLE создаст новую, изначально пустую таблицу в текущей базе
данных. Таблица будет принадлежать пользователю, выполнившему эту команду.
Если задано имя схемы (например CREATE TABLE myschema.mytable ...), то таблица
создается в указанной схеме. В остальных случаях она создается в текущей схеме.
Временные таблицы существуют в специальной схеме, поэтому при их создании не может
быть задано имя схемы. Имя таблицы должно отличаться от имени любого другого
отношения (таблицы, последовательности, индекса, представления, материализованного
представления или сторонней таблицы) в той же схеме.
Также команда CREATE TABLE автоматически создает тип данных, представляющий
составной тип, соответствующий одной строке таблицы. Поэтому таблицы не могут
иметь то же имя, что и любой существующий тип данных в той же схеме.
Необязательные предложения ограничений определяют ограничения (тесты), которым новые или измененные строки должны удовлетворять для успешного выполнения операции добавления или изменения. Ограничение — это объект SQL, который помогает различными способами определить набор допустимых значений в таблице.
Существует два способа определения ограничений: ограничения таблицы и ограничения столбца. Ограничение столбца определяется как часть определения столбца. Определение ограничения таблицы не привязано к определенному столбцу и может охватывать несколько столбцов. Каждое ограничение столбца может быть также записано как ограничение таблицы; ограничение столбца введено только для удобства нотации, если ограничение затрагивает только один столбец.
Чтобы иметь возможность создать таблицу, необходимо иметь право USAGE на все типы столбцов или тип в предложении OF соответственно.
Параметры
TEMPORARY или TEMP
Если указан этот параметр, таблица создается как временная таблица. Временные
таблицы автоматически удаляются в конце сеанса или, при необходимости, в конце
текущей транзакции (см. предложение ON COMMIT ниже). В путь поиска
(search_path) по умолчанию первой включается временная схема, поэтому
существующие постоянные таблицы с теми же именами не будут выбираться для новых
планов, пока существуют временные таблицы, если только к ним не обращаются по
именам, дополненным схемой. Все индексы, созданные во временной таблице, также
автоматически становятся временными.
Процесс «Автовакуум» не может получить доступ и, следовательно, не может очищать
или анализировать временные таблицы. По этой причине соответствующие операции
очистки и анализа должны выполняться с помощью сеансовых команд SQL. Например,
если временная таблица будет использоваться в сложных запросах, целесообразно
после ее заполнения запустить для нее ANALYZE.
При желании перед TEMPORARY или TEMP можно написать GLOBAL или LOCAL.
В настоящее время в QHB это не имеет никакого значения и является
устаревшим; см. параграф Совместимость ниже.
UNLOGGED
Если указан этот параметр, таблица создается как нежурналируемая. Данные,
записанные в нежурналируемые таблицы, не записываются в журнал упреждающей записи
(см. главу Надежность и журнал упреждающей записи), что делает их значительно
быстрее обычных таблиц. Однако они не защищены от сбоев: нежурналируемая таблица
автоматически усекается после сбоя или небезопасного завершения работы. Кроме
того, содержимое нежурналируемой таблицы не реплицируется на резервные серверы.
Все индексы, созданные в нежурналируемой таблице, тоже автоматически становятся
нежурналируемыми.
При указании этого параметра все последовательности, создаваемые вместе с
нежурналируемой таблицей (для столбцов идентификации или serial) тоже создаются
как нежурналируемые.
IF NOT EXISTS
Не выдавать ошибку, если отношение с тем же именем уже существует. В этом случае просто выводится уведомление. Обратите внимание, что нет никакой гарантии, что существующее отношение хоть чем-то похоже на то, которое было бы создано.
имя_таблицы
Имя создаваемой таблицы (может быть дополнено схемой).
OF имя_типа
Создает типизированную таблицу, которая берет свою структуру из указанного
составного типа (имя может быть дополнено схемой). Типизированная таблица
привязывается к своему типу: например, при удалении типа (с помощью DROP TYPE ... CASCADE) такая таблица тоже будет удалена.
При создании типизированной таблицы типы данных столбцов определяются нижележащим
составным типом и не задаются командой CREATE TABLE. Но CREATE TABLE может
добавлять в таблицу значения по умолчанию и ограничения, а также указать параметры
хранения.
имя_столбца
Имя столбца, создаваемого в новой таблице.
тип_данных
Тип данных столбца. Может включать в себя спецификаторы массива. Подробную информацию о типах данных, поддерживаемых QHB, см. в главе Типы данных.
COLLATE правило_сортировки
Предложение COLLATE назначает правило сортировки для столбца (который должен иметь сортируемый тип данных). Если этот параметр не указан, используется правило сортировки по умолчанию для типа данных столбца.
STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT }
Эта форма устанавливает режим хранения для столбца. Она определяет, будет ли этот столбец храниться внутри таблицы или во вспомогательной таблице TOAST, и должны ли сжиматься данные или нет. Режим PLAIN следует использовать для значений фиксированной длины, таких как integer, и данные хранятся внутри, без сжатия. Режим MAIN предназначен для хранения внутри сжимаемых данных. Режим EXTERNAL — для внешнего хранения несжатых данных, а EXTENDED — для внешнего хранения сжатых данных. Указание DEFAULT устанавливает режим хранения по умолчанию для типа данных столбца. Для большинства типов данных, поддерживающих хранилище, отличное от PLAIN, режимом по умолчанию является EXTENDED. Использование EXTERNAL ускорит выполнение операций с подстроками на очень больших значениях text и bytea за счет увеличения объема хранилища. Более подробную информацию см. в разделе TOAST.
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, которые обычно влияют на таблицу и всех ее
потомков, будут каскадно распространяться на все партиции, но также могут
выполняться на отдельной партиции.
Обратите внимание, что создание партиции с использованием PARTITION OF требует
установки блокировки ACCESS EXCLUSIVE на родительской партиционированной
таблице. Аналогично удаление партиции с помощью DROP TABLE требует установки
блокировки ACCESS EXCLUSIVE на родительской таблице. Можно воспользоваться
командой ALTER TABLE ATTACH/DETACH PARTITION для выполнения
этих операций с менее строгой блокировкой, тем самым снизив воздействие на
параллельные операции с этой партиционированной таблицей.
LIKE исходная_таблица [ параметр_like ... ]
Предложение LIKE задает таблицу, из которой новая таблица автоматически
копирует все имена столбцов, их типы данных и их ограничения NOT NULL.
В отличие от INHERITS, новая и исходная таблицы полностью разъединяются после
завершения создания. Изменения в исходной таблицы не будут применяться к новой
таблице, и нет возможности включить данные новой таблицы в результаты сканирования
исходной таблицы.
Также, в отличие от INHERITS, столбцы и ограничения, скопированные при помощи
LIKE, не объединяются с одноименными столбцами и ограничениями. Если одно и
то же имя указано явно или содержится в другом предложении 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 указано OVERRIDING SYSTEM VALUE.
При выборе BY DEFAULT пользовательское значение имеет приоритет. Дополнительную
информацию см. на справочной странице команды INSERT. (В команде COPY всегда
используются пользовательские значения, независимо от значения этого параметра.)
В команде UPDATE при выборе ALWAYS любая попытка заменить содержимое
столбца на любое значение, отличное от DEFAULT, будет отвергнута. При выборе
BY DEFAULT столбец можно изменить как обычно. (Предложение OVERRIDING для
команды UPDATE отсутствует.)
Необязательное предложение параметры_последовательности можно использовать
для переопределения параметров последовательности. Доступные параметры включают
в себя параметры для CREATE SEQUENCE, а также SEQUENCE NAME имя,
LOGGED и UNLOGGED, которые позволяют выбрать имя и уровень хранимости
последовательности. Без SEQUENCE NAME система выбирает для последовательности
неиспользованное имя. Без LOGGED и UNLOGGED у последовательности будет
тот же уровнь хранимости, что и у таблицы.
UNIQUE [ NULLS [ NOT ] DISTINCT ] (ограничение столбца)
UNIQUE [ NULLS [ NOT ] DISTINCT ] ( имя_столбца [, ... ] ) [ INCLUDE ( имя_столбца [, ...]) ] (ограничение таблицы)
Ограничение UNIQUE указывает, что группа из одного или нескольких столбцов
таблицы может содержать только уникальные значения. Поведение ограничения
уникальности для таблицы такое же, как и для столбцов, с дополнительной
возможностью охватывать несколько столбцов. Тем самым это ограничение гарантирует,
что любые две строки должны отличаться хотя бы в одном из этих столбцов.
При проверке ограничения уникальности значения NULL считаются равными, только
если указано NULLS NOT DISTINCT.
Каждое ограничение уникальности для таблицы должно содержать имя набора столбцов,
отличного от набора столбцов, названных любым другим ограничением уникальности или
первичного ключа, определенным для таблицы. (В противном случае избыточное
ограничение уникальности не будет учитываться.)
При установлении ограничения уникальности для многоуровневой иерархии партиций в
определение ограничения должны быть включены все столбцы в ключе партиционирования
целевой партиционированной таблицы, а также столбцы всех ее дочерних
партиционированных таблиц.
Добавление ограничения уникальности автоматически создаст уникальный индекс
В-дерево для столбца или группы столбцов, используемых в этом ограничении.
Необязательное предложение 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. Подмножество столбцов можно задать только для действий ON DELETE. - SET DEFAULT [ ( имя_столбца [, ... ] ) ]
Установить во всех ссылающихся столбцах или в заданном подмножестве ссылающихся столбцов значения по умолчанию. Подмножество столбцов можно задать только для действий ON DELETE. (В ссылочной таблице должна быть строка, соответствующая этим значениям по умолчанию, если их значение не равно 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.
Ограничения внешнего ключа
Возможность указывать списки столбцов в действиях внешнего ключа SET DEFAULT и SET NULL является расширением QHB.
Способность ограничения внешнего ключа ссылаться на столбцы уникального индекса вместо столбцов первичного ключа или ограничения уникальности является расширением 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