CREATE TABLE
Эта страница переведена при помощи нейросети GigaChat.
CREATE TABLE - создание новой таблицы.
Синтаксис
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name ( [
{ column_name data_type [ STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ] [ COMPRESSION compression_method ] [ COLLATE collation ] [ column_constraint [ ... ] ]
| table_constraint
| LIKE source_table [ like_option ... ] }
[, ... ]
] )
[ INHERITS ( parent_table [, ... ] ) ]
[ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ]
[ USING method ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name
OF type_name [ (
{ column_name [ WITH OPTIONS ] [ column_constraint [ ... ] ]
| table_constraint }
[, ... ]
) ]
[ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ]
[ USING method ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name
PARTITION OF parent_table [ (
{ column_name [ WITH OPTIONS ] [ column_constraint [ ... ] ]
| table_constraint }
[, ... ]
) ] { FOR VALUES partition_bound_spec | DEFAULT }
[ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ]
[ USING method ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]
where column_constraint is:
[ CONSTRAINT constraint_name ]
{ NOT NULL [ NO INHERIT ] |
NULL |
CHECK ( expression ) [ NO INHERIT ] |
DEFAULT default_expr |
GENERATED ALWAYS AS ( generation_expr ) [ STORED | VIRTUAL ] |
GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ] |
UNIQUE [ NULLS [ NOT ] DISTINCT ] index_parameters |
PRIMARY KEY index_parameters |
REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
[ ON DELETE referential_action ] [ ON UPDATE referential_action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ ENFORCED | NOT ENFORCED ]
and table_constraint is:
[ CONSTRAINT constraint_name ]
{ CHECK ( expression ) [ NO INHERIT ] |
NOT NULL column_name [ NO INHERIT ] |
UNIQUE [ NULLS [ NOT ] DISTINCT ] ( column_name [, ... ] [, column_name WITHOUT OVERLAPS ] ) index_parameters |
PRIMARY KEY ( column_name [, ... ] [, column_name WITHOUT OVERLAPS ] ) index_parameters |
EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ] |
FOREIGN KEY ( column_name [, ... ] [, PERIOD column_name ] ) REFERENCES reftable [ ( refcolumn [, ... ] [, PERIOD refcolumn ] ) ]
[ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ ENFORCED | NOT ENFORCED ]
and like_option is:
{ INCLUDING | EXCLUDING } { COMMENTS | COMPRESSION | CONSTRAINTS | DEFAULTS | GENERATED | IDENTITY | INDEXES | STATISTICS | STORAGE | ALL }
and partition_bound_spec is:
IN ( partition_bound_expr [, ...] ) |
FROM ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] )
TO ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] ) |
WITH ( MODULUS numeric_literal, REMAINDER numeric_literal )
index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:
[ INCLUDE ( column_name [, ... ] ) ]
[ WITH ( storage_parameter [= value] [, ... ] ) ]
[ USING INDEX TABLESPACE tablespace_name ]
exclude_element in an EXCLUDE constraint is:
{ column_name | ( expression ) } [ COLLATE collation ] [ opclass [ ( opclass_parameter = value [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]
referential_action in a FOREIGN KEY/REFERENCES constraint is:
{ NO ACTION | RESTRICT | CASCADE | SET NULL [ ( column_name [, ... ] ) ] | SET DEFAULT [ ( column_name [, ... ] ) ] }
Описание
CREATE TABLE создает новую, изначально пустую таблицу в текущей базе данных. Владельцем таблицы становится пользователь, выполняющий команду.
Если указано имя схемы (например, CREATE TABLE myschema.mytable ...), таблица создается в указанной схеме. В противном случае она создается в текущей схеме. Временные таблицы существуют в специальной схеме, поэтому при создании временной таблицы имя схемы указывать нельзя. Имя таблицы должно отличаться от имен любых других объектов (таблиц, последовательностей, индексов, представлений, материализованных представлений или внешних таблиц) в той же схеме.
Команда CREATE TABLE также автоматически создает тип данных, представляющий составной тип, соответствующий одной строке таблицы. Поэтому таблицы не могут иметь такое же имя, как существующий тип данных в той же схеме.
Необязательные выражения с ограничениями задают условия, которым должны удовлетворять новые или обновленные строки, чтобы операции INSERT или UPDATE прошли успешно. Ограничение — это объект SQL, который помогает определить допустимые значения в таблице различными способами.
Существует два способа задания ограничений: табличные ограничения и ограничения столбца. Ограничение столбца задается внутри определения столбца. Табличное ограничение не привязано к конкретному столбцу и может охватывать сразу несколько столбцов. Любое ограничение столбца можно записать как табличное ограничение, ограничение столбца — это просто сокращенная форма записи, удобная, когда ограничение касается только одного столбца.
Чтобы иметь возможность создать таблицу, необходимо иметь привилегию USAGE на все используемые типы данных столбцов, либо на тип, указанный в выражении OF (если оно используется).
Параметры
TEMPORARY или TEMP
Создает временную таблицу, которая автоматически удаляется в конце текущей сессии или, при необходимости, после завершения транзакции (смотрите параметр ON COMMIT). Имена временных таблиц могут совпадать с постоянными — временные будут использоваться приоритетно, пока существуют. Индексы, созданные для таких таблиц, также будут временными.
Автоматическая очистка (autovacuum) не работает с временными таблицами, поэтому операции VACUUM и ANALYZE следует выполнять вручную в рамках сессии. Например, перед выполнением сложных запросов желательно вызвать ANALYZE.
Также можно указать GLOBAL или LOCAL перед TEMPORARY, но в PostgreSQL это устаревшее и не влияет на поведение.
UNLOGGED
Создает таблицу как нежурналируемую. Данные, записываемые в такие таблицы, не попадают в журнал предзаписи (смотрите главу «Надежность и журнал записи»), что делает их существенно быстрее обычных таблиц. Однако они не защищены от сбоев: после сбоя или некорректного завершения работы нежурналируемая таблица автоматически обнуляется. Содержимое нежурналируемой таблицы также не реплицируется на серверы реплики. Все индексы, создаваемые для нежурналируемой таблицы, также будут нежурналируемыми.
Если это указано, все последовательности, создаваемые вместе с таблицей (например, для столбцов IDENTITY или SERIAL), также будут нежурналируемыми.
Данная форма не поддерживается для секционированных таблиц.
IF NOT EXISTS
Не выдает ошибку, если таблица с таким именем уже существует. Вместо этого выводится предупреждение. Однако нет гарантии, что уже существующая таблица совпадает по структуре с той, которая создавалась.
table_name
Задает имя таблицы, при необходимости дополненное схемой, которая должна быть удалена.
OF type_name
Создает типизированную таблицу, структура которой заимствована из указанного автономного составного типа (то есть, созданного с помощью CREATE TYPE), хотя при этом создается и новый составной тип. Таблица будет зависеть от указанного типа, то есть каскадные действия по изменению и удалению этого типа будут распространяться и на таблицу.
Типизированная таблица всегда имеет те же имена столбцов и типы данных, что и тип, от которого она производна, поэтому указать дополнительные столбцы нельзя. Однако команда CREATE TABLE позволяет добавлять значения по умолчанию и ограничения к таблице, а также задавать параметры хранения.
column_name
Задает имя создаваемого столбца в новой таблице.
data_type
Задает тип данных столбца. Это могут быть спецификаторы массива.
COLLATE collation
Устанавливает правило сортировки (collation) для столбца. По умолчанию используется сортировка, заданная типом данных.
STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT }
Эта форма устанавливает режим хранения для столбца. Она контролирует, хранится ли этот столбец непосредственно в основной таблице или во вторичной TOAST-таблице, а также должна ли сжиматься информация или нет. PLAIN необходимо использовать для фиксированных значений, таких как integer, и он размещает данные напрямую, несжатыми. MAIN предназначен для встроенных, сжимаемых данных. EXTERNAL предназначен для внешних, несжатых данных, а EXTENDED — для внешних, сжатых данных. Запись DEFAULT устанавливает режим хранения в значение по умолчанию для типа данных столбца. EXTENDED является значением по умолчанию для большинства типов данных, поддерживающих хранение вне PLAIN. Использование EXTERNAL ускорит выполнение операций над подстроками очень больших значений text и bytea, но потребует больше места для хранения.
COMPRESSION compression_method
Задает метод сжатия для столбца (только для переменной длины). Работает при включенном режиме хранения main или extended. Смотрите ALTER TABLE для получения информации о режимах хранения столбцов.
Поддерживаемые методы сжатия включают pglz и lz4. (lz4 доступен только в том случае, если при сборке PostgreSQL использовался --with-lz4.) Кроме того, compression_method может быть установлено в default для явного указания поведения по умолчанию, которое заключается в использовании настройки default_toast_compression.
Для партиционированной таблицы это значение не оказывает непосредственного влияния, но будет унаследовано новыми партициями.
INHERITS (parent_table [, ... ])
Задает список таблиц, от которых новая таблица наследует все столбцы. Родительские таблицы могут быть обычными или внешними. Параметр INHERITS является опциональным.
Использование INHERITS создает постоянную связь между дочерней таблицей и родительской. Изменения схемы родительской таблицы, как правило, распространяются на дочерние таблицы, и данные дочерних таблиц включаются в выборки по родительским таблицам.
Если одинаковые имена столбцов присутствуют в нескольких родительских таблицах, будет выдана ошибка, если типы данных не совпадают. При совпадении типы объединяются в один столбец. Если новая таблица содержит столбец с тем же именем, что и унаследованный, его тип данных должен совпадать, и определения объединяются. Значения по умолчанию в новой таблице переопределяют унаследованные. Иначе все родительские таблицы, указывающие значение по умолчанию, должны указывать одно и то же значение — иначе будет ошибка.
Ограничения CHECK объединяются аналогично: если несколько родительских таблиц или новая таблица содержат ограничения с одинаковыми именами, выражения должны совпадать, иначе будет ошибка. Ограничения с одинаковыми именем и выражением объединяются. Ограничения с флагом NO INHERIT не учитываются. Безымянные ограничения из новой таблицы никогда не объединяются, так как им всегда присваивается уникальное имя.
Параметры STORAGE для столбцов также копируются из родительских таблиц.
Если столбец в родительской таблице является IDENTITY, это свойство не наследуется. Однако в дочерней таблице столбец можно объявить как IDENTITY отдельно.
PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ opclass ] [, ...] )
Задает стратегию партиционирования таблицы. Создается партиционированная таблица. Перечисленные в скобках столбцы или выражения образуют ключ партиционирования. Параметр PARTITION BY является опциональным.
Для RANGE и HASH можно использовать до 32 столбцов или выражений. Для LIST — только один.
Для RANGE и LIST требуется класс операторов btree, для HASH — hash. Если не указан класс операторов, используется класс по умолчанию. Если он отсутствует — возникает ошибка.
партиционированная таблица делится на партиции, создаваемые отдельными CREATE TABLE. Сама таблица остается пустой. Вставленные строки направляются в соответствующую партицию в зависимости от значений ключа партиционирования.
партиционированные таблицы не поддерживают ограничения EXCLUDE, но их можно указать для отдельных партиций.
PARTITION OF parent_table {FOR VALUES partition_bound_spec | DEFAULT}
Создает таблицу как партицию указанной родительской таблицы. Таблица может быть создана как партиция для конкретных значений с помощью FOR VALUES, либо как партиция по умолчанию с помощью DEFAULT. Все индексы, ограничения и определенные пользователем триггеры уровня строк, существующие в родительской таблице, копируются в новую партицию.
partition_bound_spec (спецификация границ партиции) должна соответствовать методу партиционирования и ключу партиционирования родительской таблицы, и не должна пересекаться с существующими партициями этой таблицы. Форма IN используется для партиционирования по списку, форма FROM и TO — для партиционирования по диапазону, а форма WITH — для партиционирования по хешу.
partition_bound_expr — это произвольное выражение без переменных (запросы, оконные функции, агрегатные функции и функции, возвращающие множества, не допускаются). Тип данных выражения должен соответствовать типу данных соответствующего столбца ключа партиционирования. Выражение вычисляется один раз при создании таблицы, поэтому оно может содержать даже нестабильные выражения, такие как 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— любое ненулевое значение;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, поддерживают значение «бесконечности», которое можно хранить в таблице. Это отличается от MINVALUE и MAXVALUE, которые не являются значениями, доступными для хранения. Они служат лишь для обозначения отсутствия границ. Например, диапазон FROM ('infinity') TO (MAXVALUE) не пуст, он допускает один элемент — infinity.
Если указано DEFAULT, таблица создается как партиция по умолчанию для родительской таблицы. Этот параметр недоступен для таблиц с хеш-партиционированием. Значения ключа партиционирования, не подходящие ни под одну из партиций, будут направлены в партицию по умолчанию.
Если у таблицы уже есть партиция по умолчанию, и создается новая партиция, PostgreSQL должен просканировать партицию по умолчанию, чтобы убедиться, что в ней нет строк, которые должны быть перенесены в новую партицию. При большом объеме данных это может занять время. Сканирование будет пропущено, если партиция по умолчанию — внешняя таблица или если у нее есть ограничение, доказывающее невозможность наличия таких строк.
При создании хеш-партиции необходимо указать модуль и остаток. Модуль — положительное целое число, Остаток — неотрицательное число, меньше модуля. Обычно при начальной настройке таблицы с партиционированием по хешу нужно выбрать модуль, равный количеству партиций, и назначить каждой партиции этот модуль и разные остатки (смотрите примеры ниже).
Тем не менее, это не обязательно — допустимо, чтобы модуль каждой партиции был делителем следующего по величине модуля. Это позволяет поэтапно увеличивать количество партиций без переноса всех данных сразу. Например, предположим, есть таблица, партиционируемая по хешу на 8 партиций, для каждой из которых назначен модуль 8, и возникла необходимость увеличить число партиций до 16. Можно отсоединить одну из партиций по модулю 8, создать две новые партиции по модулю 16, покрывающих ту же часть пространства ключа (одну с остатком, равным остатку отсоединенной партиции, а вторую с остатком, равным тому же остатку плюс 8), и вновь наполнить их данными. Можно повторять эту операцию (возможно, позже) для остальных партиций по модулю 8, пока все они не будут заменены. Хотя и при таком подходе может потребоваться перемещать большие объемы данных на каждом этапе, это все же лучше, чем создавать абсолютно новую таблицу и перемещать все данные сразу.
партиция должна иметь те же имена столбцов и типы, что и родительская таблица. Изменения имен или типов столбцов родительской таблицы автоматически распространяются на все партиции. Ограничения CHECK наследуются автоматически, но партиция может иметь дополнительные ограничения. Если в партиции и родительском элементе есть CHECK с одинаковым именем и условием — они объединяются. Значения по умолчанию (DEFAULT) можно задавать отдельно для каждой партиции, но они не применяются при вставке строки через партиционированную таблицу.
Строки, вставленные в партиционированную таблицу, будут автоматически направлены в подходящую партицию. Если подходящей партиции нет — возникнет ошибка.
Такие операции, как TRUNCATE, обычно затрагивают и саму таблицу, и каскадно распространяются на все дочерние партиции, но могут также выполняться в отдельных партициях.
Обратите внимание, что создание партиции с PARTITION OF требует блокировки ACCESS EXCLUSIVE на родительской таблице. То же касается удаления партиции с помощью DROP TABLE. Вместо этого можно использовать ALTER TABLE ATTACH/DETACH PARTITION, которые используют менее строгие блокировки и позволяют снизить конфликтность при параллельной работе с таблицей.
LIKE source_table [like_option ...]
Задает таблицу, из которой новая таблица автоматически копирует все имена столбцов, их типы данных и ограничения NOT NULL.
В отличие от INHERITS, новая таблица и исходная таблица полностью разъединены после завершения создания. Изменения в исходной таблице не будут применяться к новой таблице, и невозможно включить данные новой таблицы в выборки из исходной таблицы.
Также, в отличие от INHERITS, столбцы и ограничения, скопированные с помощью LIKE, не объединяются с одноименными столбцами и ограничениями. Если одно и то же имя указано явно или в другом выражении LIKE, будет выдана ошибка.
Необязательные выражения like_option указывают, какие дополнительные свойства исходной таблицы нужно скопировать. Указание 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 — смотрите раздел TOAST.
INCLUDING ALL
: INCLUDING ALL — это сокращенная форма, выбирающая все доступные индивидуальные параметры. Может быть полезно указать отдельные выражения EXCLUDING после INCLUDING ALL, чтобы выбрать все, кроме конкретных свойств.
LIKE также может использоваться для копирования определений столбцов из представлений, внешних таблиц или составных типов. Неприменимые параметры (например, INCLUDING INDEXES из представления) игнорируются.
CONSTRAINT constraint_name
Задает необязательное имя для ограничения столбца или таблицы. Если ограничение нарушено, имя ограничения отображается в сообщениях об ошибке, поэтому имена вроде col must be positive могут быть использованы для передачи полезной информации клиентским приложениям. Для указания имен ограничений, содержащих пробелы, необходимо использовать двойные кавычки. Если имя ограничения не указано, система сгенерирует его автоматически.
NOT NULL [ NO INHERIT ]
В столбце не допускается наличие значений NULL.
Ограничение, помеченное как NO INHERIT, не будет распространяться на дочерние таблицы.
NULL
Указывает, что столбец может содержать значения NULL. Это поведение по умолчанию.
Это выражение предоставляется только для совместимости с нестандартными СУБД. Ее использование не рекомендуется в новых приложениях.
CHECK ( expression ) [ NO INHERIT ]
Задает выражение, возвращающее логическое значение, которому должны соответствовать новые или обновленные строки для успешного выполнения операции вставки или обновления. Выражения, которые вычисляются в TRUE или UNKNOWN, считаются успешными. Если хотя бы одна строка операции вставки или обновления возвращает значение FALSE, генерируется исключение, и операция не изменяет базу данных. Ограничение CHECK, заданное как ограничение столбца, должно ссылаться только на значение этого столбца, тогда как выражение в ограничении таблицы может ссылаться на несколько столбцов.
В настоящее время выражения CHECK не могут содержать подзапросы или ссылаться на переменные, отличные от столбцов текущей строки. Системный столбец tableoid может быть использован, но никакие другие системные столбцы — нет.
Ограничение, помеченное как NO INHERIT, не будет распространяться на дочерние таблицы.
Если таблица имеет несколько ограничений CHECK, они проверяются для каждой строки в алфавитном порядке по имени, после проверки ограничений NOT NULL. Версии PostgreSQL до 9.5 не гарантировали определенный порядок выполнения ограничений CHECK.
DEFAULT default_expr
Задает значение по умолчанию для столбца, в котором она указана. Значением может быть любое выражение без переменных (в частности, перекрестные ссылки на другие столбцы текущей таблицы не допускаются). Также не допускаются подзапросы. Тип данных выражения по умолчанию должен совпадать с типом столбца.
Выражение по умолчанию будет использовано при любой вставке, если явно не указано значение для столбца. Если значение по умолчанию не задано, используется NULL.
GENERATED ALWAYS AS ( generation_expr ) [ STORED | VIRTUAL ]
Этот пункт создает столбец как сгенерированный. В столбец нельзя записывать данные, а при чтении будет возвращен результат указанного выражения.
Если указан параметр VIRTUAL, столбец будет вычисляться при чтении и не будет занимать место в памяти. Если указан параметр STORED, столбец будет вычисляться при записи и будет сохраняться на диске. VIRTUAL — значение по умолчанию.
Выражение генерации может ссылаться на другие столбцы в таблице, но не на другие сгенерированные столбцы. Все используемые функции и операторы должны быть неизменяемыми. Ссылки на другие таблицы не допускаются.
Виртуальный сгенерированный столбец не может иметь определяемый пользователем тип, и выражение генерации виртуального сгенерированного столбца не должно ссылаться на определяемые пользователем функции или типы, то есть оно может использовать только встроенные функции или типы. Это также относится косвенно, например, к функциям или типам, лежащим в основе операторов или приведения типов. (Это ограничение не существует для хранимых сгенерированных столбцов.)
GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ]
Создает столбец как столбец идентификатор. Ему сопоставляется неявная последовательность, из которой будут автоматически выдаваться значения для новых строк. Такой столбец неявно считается NOT NULL.
Ключевые слова ALWAYS и BY DEFAULT определяют, как обрабатываются явно заданные значения при выполнении команд INSERT и UPDATE:
- В команде
INSERT, если указаноALWAYS, пользовательское значение принимается только при использованииOVERRIDING SYSTEM VALUE. - Если указано
BY DEFAULT— пользовательское значение имеет приоритет. Смотрите INSERT для получения подробной информации. В командеCOPYпользовательские значения всегда используются независимо от настройки. - В команде
UPDATE, если указаноALWAYS— любые попытки изменить значение столбца, кроме как наDEFAULT, будут отклонены. Если указаноBY DEFAULT— обновление выполняется как обычно. ДляUPDATEнет выраженияOVERRIDING.
Необязательные sequence_options позволяют переопределить параметры последовательности. Доступны все параметры команды CREATE SEQUENCE, а также SEQUENCE NAME name, LOGGED и UNLOGGED, позволяющие задать имя и режим журналирования для последовательности. Если SEQUENCE NAME не указан, система сама подбирает уникальное имя. Если не указаны LOGGED или UNLOGGED, последовательность наследует уровень журналирования таблицы.
UNIQUE [ NULLS [ NOT ] DISTINCT ] (ограничение столбца)UNIQUE [ NULLS [ NOT ] DISTINCT ] ( column_name [, ... ] ) [ INCLUDE ( column_name [, ...]) ] (ограничение таблицы)
Ограничение UNIQUE указывает, что группа из одного или нескольких столбцов таблицы может содержать только уникальные значения. Поведение ограничения уникальности таблицы аналогично поведению ограничения уникальности столбца, с дополнительной возможностью охватывать несколько столбцов. Таким образом, ограничение гарантирует, что любые две строки должны отличаться хотя бы в одном из этих столбцов.
Если для последнего столбца указана опция WITHOUT OVERLAPS, то проверка на перекрытие выполняется для этого столбца, а не на равенство. В этом случае другие столбцы ограничения будут допускать дубликаты, если дубликаты не перекрываются в столбце WITHOUT OVERLAPS. (Это иногда называют временным ключом, если столбец представляет собой диапазон дат или временных меток, но PostgreSQL допускает диапазоны по любому базовому типу.) По сути, такое ограничение выполняется с помощью ограничения EXCLUDE, а не ограничения UNIQUE. Так, например, UNIQUE (id, valid_at WITHOUT OVERLAPS) ведет себя как EXCLUDE USING GIST (id WITH =, valid_at WITH &&). Столбец WITHOUT OVERLAPS должен иметь тип диапазона или мультидиапазона. Пустые диапазоны/мультидиапазоны не допускаются. Столбцы ограничения, не относящиеся к WITHOUT OVERLAPS, могут иметь любой тип, который может быть сравнен на равенство в индексе GiST. По умолчанию поддерживаются только типы диапазонов, но другие типы можно использовать, добавив расширение btree_gist (что является ожидаемым способом использования этой функции).
Для целей уникального ограничения значения NULL не считаются равными, если не указано NULLS NOT DISTINCT.
Каждое уникальное ограничение должно указывать набор столбцов, отличающийся от набора столбцов, указанных в любом другом уникальном или первичном ключевом ограничении, определенном для таблицы. (В противном случае избыточные уникальные ограничения будут отброшены.)
При установлении уникального ограничения для многоуровневой иерархии секций все столбцы в ключе секционирования целевой секционированной таблицы, а также столбцы всех ее дочерних секционированных таблиц, должны быть включены в определение ограничения.
Добавление уникального ограничения автоматически создаст уникальный B-дерево индекс по столбцу или группе столбцов, используемых в ограничении. Но если ограничение включает предложение WITHOUT OVERLAPS, будет использоваться индекс GiST. Созданный индекс будет иметь то же имя, что и уникальное ограничение.
Необязательное предложение INCLUDE добавляет к этому индексу один или несколько столбцов, которые являются просто «полезной нагрузкой»: уникальность для них не обеспечивается, и поиск по этим столбцам в индексе невозможен. Однако их можно получить с помощью сканирования только по индексу. Обратите внимание, что хотя ограничение не применяется к включенным столбцам, оно все же зависит от них. Следовательно, некоторые операции над такими столбцами (например, DROP COLUMN) могут привести к каскадному удалению ограничений и индексов.
PRIMARY KEY (ограничение столбца)PRIMARY KEY ( column_name [, ... ] ) [ INCLUDE ( column_name [, ...]) ] (ограничение таблицы)
Требует, чтобы указанные столбцы содержали только уникальные и NOT NULL значения. В таблице может быть только один первичный ключ, независимо от того, задан он как ограничение столбца или таблицы.
Ограничение должно включать уникальный набор столбцов, отличный от всех других UNIQUE ограничений в таблице (иначе уникальное ограничение считается избыточным и отбрасывается).
PRIMARY KEY совмещает требования UNIQUE и NOT NULL и служит также метаданными для определения уникальных идентификаторов, на которые могут ссылаться другие таблицы.
Для партиционированных таблиц применяются те же ограничения, что и для UNIQUE.
Добавление PRIMARY KEY автоматически создает уникальный B-tree индекс по столбцу или группе столбцов, перечисленных в ограничении. Созданный индекс наследует имя ограничения первичного ключа.
Необязательное выражение INCLUDE добавляет к этому индексу один или несколько столбцов, составляющих просто «дополнительную нагрузку»: для них уникальность не будет требоваться, и искать значения в них по данному индексу нельзя. Однако их содержимое может быть получено при сканировании только индекса. Заметьте, что хотя ограничение по неключевым столбцам не контролируется, оно все же зависит от них. Как следствие, некоторые операции с этими столбцами (например, DROP COLUMN) могут повлечь каскадное удаление индекса и ограничения.
EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ]
Предложение EXCLUDE определяет ограничение исключения, которое гарантирует, что при сравнении любых двух строк по указанному(ым) столбцу(ам) или выражению(ям) с использованием указанных операторов не все эти сравнения вернут TRUE. Если все указанные операторы проверяют равенство, это эквивалентно ограничению UNIQUE, хотя обычное ограничение уникальности будет работать быстрее. Однако ограничения исключения позволяют задавать условия более общего характера, чем простое равенство. Например, с помощью оператора && можно указать ограничение, запрещающее наличие в таблице двух строк с пересекающимися кругами. Операторы должны быть коммутативными.
Ограничения исключения реализуются с помощью индекса с тем же именем, что и у ограничения, поэтому каждый указанный оператор должен быть связан с соответствующим классом операторов для метода доступа к индексам index_method. Каждый элемент exclude_element определяет столбец индекса, поэтому он может опционально указывать правило сортировки, класс операторов, параметры класса операторов и/или параметры сортировки; все это подробно описано в документации CREATE INDEX.
Метод доступа должен поддерживать amgettuple (смотрите главу 63); в настоящее время это означает, что тип GIN использовать нельзя. Хотя это и разрешено, нет особого смысла использовать индексы типа B-дерево или хеш с ограничением исключения, так как они не делают ничего такого, с чем не справилось бы обычное ограничение уникальности лучше. Поэтому на практике в качестве метода доступа всегда будут использоваться GiST или SP-GiST.
Предикат позволяет задать ограничение исключения для подмножества таблицы; внутренне это создает частичный индекс. Обратите внимание, что предикат должен быть заключен в круглые скобки.
При создании ограничения исключения для многоуровневой иерархии секционирования все столбцы ключа секционирования целевой секционированной таблицы, а также всех ее дочерних секционированных таблиц, должны быть включены в определение ограничения. Кроме того, эти столбцы должны сравниваться с использованием оператора равенства. Эти ограничения гарантируют, что потенциально конфликтующие строки будут находиться в одной и той же секции. Ограничение также может ссылаться на другие столбцы, не входящие ни в один ключ секционирования, которые могут сравниваться с помощью любого подходящего оператора.
REFERENCES reftable [ ( refcolumn ) ] [ MATCH matchtype ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] (column constraint) FOREIGN KEY ( column_name [, ... ] [, PERIOD column_name ] ) REFERENCES reftable [ ( refcolumn [, ... ] [, PERIOD refcolumn ] ) ] [ MATCH matchtype ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] (table constraint)
Эти предложения определяют ограничение внешнего ключа, которое требует, чтобы группа из одного или нескольких столбцов новой таблицы содержала только значения, совпадающие со значениями в указанном(ых) столбце(ах) какой-либо строки связанной таблицы. Если список refcolumn опущен, используется первичный ключ reftable. В противном случае список refcolumn должен ссылаться на столбцы ограничения уникальности или первичного ключа, не подлежащего отложению, либо быть столбцами уникального индекса без условия.
Если последний столбец помечен как PERIOD, он обрабатывается особым образом. В то время как столбцы без PERIOD сравниваются на равенство (и хотя бы один такой столбец должен присутствовать), столбец PERIOD не сравнивается. Вместо этого ограничение считается выполненным, если в связанной таблице существуют соответствующие записи (на основе частей ключа без PERIOD), чьи объединенные значения PERIOD полностью покрывают период записи, ссылающейся на них. Другими словами, ссылка должна иметь соответствующий объект на всем протяжении своего периода. Этот столбец должен иметь тип диапазона или мультидиапазона. Кроме того, в связанной таблице должно быть объявлено ограничение первичного ключа или уникальности с указанием WITHOUT OVERLAPS. Наконец, если внешний ключ содержит спецификацию PERIOD column_name, соответствующий refcolumn, если он указан, также должен быть помечен как PERIOD. Если предложение refcolumn опущено и, следовательно, выбрано ограничение первичного ключа reftable, последний столбец этого первичного ключа должен быть помечен как WITHOUT OVERLAPS.
Для каждой пары ссылающегося и связанного столбцов, если они имеют тип данных, поддерживающий правила сортировки, их правила сортировки должны быть либо оба детерминированными, либо полностью совпадать. Это гарантирует, что оба столбца используют согласованное понятие равенства.
Пользователь должен иметь разрешение 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
: ВВывести ошибку, если удаление или обновление приведет к нарушению ограничения внешнего ключа. Если ограничение является отложенным, ошибка будет выдана в момент проверки ограничений, если к тому моменту все еще существуют строки, ссылающиеся на удаляемую или изменяемую строку. Это действие используется по умолчанию.
RESTRICT
: Выводить ошибку, если удаляемая или обновляемая строка совпадает со строкой в ссылочной таблице. Это предотвращает выполнение действия, даже если состояние после выполнения действия не нарушает ограничение внешнего ключа. В частности, это предотвращает обновление ссылочных строк значениями, которые являются различными, но сравниваются как равные. (Однако это не предотвращает «пустые» обновления, которые обновляют столбец до того же значения.)
В случае временного внешнего ключа эта опция не поддерживается.
CASCADE
: При удалении ссылаемой строки автоматически удаляет все строки, которые на нее ссылаются, либо при обновлении ссылаемой строки — обновляет значения в ссылающихся колонках на новые значения из ссылаемой строки.
В случае временного внешнего ключа эта опция не поддерживается.
SET NULL [ ( column_name [, ... ] ) ]
: Устанавливает NULL во всех ссылающихся столбцах или только в указанном подмножестве столбцов. Задание подмножества столбцов допустимо только для действий ON DELETE.
В случае временного внешнего ключа эта опция не поддерживается.
SET DEFAULT [ ( column_name [, ... ] ) ]
: Устанавливает значения по умолчанию во всех ссылающихся столбцах или в указанном подмножестве столбцов. Задание подмножества столбцов также допустимо только для действий ON DELETE. Если значения по умолчанию не NULL, в ссылаемой таблице должна существовать строка, соответствующая этим значениям, иначе операция завершится ошибкой.
Если ссылаемые столбцы часто изменяются, имеет смысл создать индекс на ссылающихся столбцах, чтобы действия ссылочного контроля, связанные с ограничением внешнего ключа, выполнялись эффективнее.
В случае временного внешнего ключа эта опция не поддерживается.
DEFERRABLENOT DEFERRABLE
Определяет, может ли проверка ограничения быть отложена. Ограничение, заданное как NOT DEFERRABLE, проверяется немедленно после выполнения каждой команды. Ограничения, заданные как DEFERRABLE, могут быть проверены в конце транзакции (с помощью команды SET CONSTRAINTS). По умолчанию используется NOT DEFERRABLE.
В настоящее время только ограничения типов UNIQUE, PRIMARY KEY, EXCLUDE и REFERENCES (внешний ключ) поддерживают это выражение. Ограничения NOT NULL и CHECK отложены быть не могут. Обратите внимание: отложенные ограничения не могут использоваться как механизм разрешения конфликтов в выражении INSERT ... ON CONFLICT DO UPDATE.
INITIALLY IMMEDIATEINITIALLY DEFERRED
Если ограничение может быть отложено, это выражение указывает, когда по умолчанию выполнять его проверку. Если указано INITIALLY IMMEDIATE, ограничение проверяется после каждой инструкции. Это поведение по умолчанию. Если указано INITIALLY DEFERRED, ограничение проверяется только в конце транзакции. Время проверки ограничения можно изменить с помощью команды SET CONSTRAINTS.
ENFORCED
NOT ENFORCED
Когда ограничение задано как ENFORCED, СУБД гарантирует его соблюдение, проверяя ограничение в соответствующие моменты (после каждого оператора или в конце транзакции, в зависимости от ситуации). Это значение по умолчанию. Если ограничение задано как NOT ENFORCED, СУБД не будет выполнять проверку ограничения. В таком случае ответственность за соблюдение ограничений ложится на код приложения. СУБД все же может предполагать, что данные действительно соответствуют ограничению, для принятия решений об оптимизации, если это не влияет на корректность результата.
Ограничения NOT ENFORCED могут быть полезны в качестве документации, если фактическая проверка ограничения во время выполнения слишком затратна.
В настоящее время поддерживается только для ограничений внешнего ключа и CHECK.
USING method
Указывает метод доступа к таблице, который будет использоваться для хранения содержимого новой таблицы. Метод должен быть типа TABLE. Выражение USING method является необязательным.
Подробнее смотрите главу «Определение интерфейса для индексных методов доступа» для подробностей. Если метод не указан, будет использован метод доступа по умолчанию. Подробнее смотрите параметр default_table_access_method.
При создании раздела метод доступа к таблице соответствует методу доступа его партиционинированной таблицы, если он установлен.
WITH ( storage_parameter [= value] [, ... ] )
Задает необязательные параметры хранения для таблицы или индекса. Смотрите раздел Параметры хранения ниже для подробностей.
Для обратной совместимости выражение WITH может включать OIDS=FALSE, чтобы указать, что строки новой таблицы не должны содержать OID (идентификаторы объектов). OIDS=TRUE больше не поддерживается.
WITHOUT OIDS
Синтаксис обратной совместимости для объявления таблицы WITHOUT OIDS, создание таблицы WITH OIDS больше не поддерживается.
ON COMMIT
Определяет поведение временной таблицы при завершении транзакционного блока. Доступны три варианта:
-
PRESERVE ROWS- никакие особые действия не выполняются при завершении транзакции. Это поведение по умолчанию. -
DELETE ROWS- все строки во временной таблице удаляются в конце каждого транзакционного блока (по сути, происходит автоматическое TRUNCATE при каждомCOMMIT). Если используется с партиционированной таблицей, это не распространяется на ее партиции. -
DROP- временная таблица удаляется в конце текущего транзакционного блока. Если используется с партиционированной таблицей, удаляются также ее партиции. Если используется с таблицами, имеющими дочерние таблицы по наследованию, также удаляются эти дочерние таблицы.
TABLESPACE tablespace_name
Задает имя табличного пространства, в котором должна быть создана новая таблица. Если не указано, используется default_tablespace, а для временных таблиц — temp_tablespaces. Для партиционированных таблиц, так как они сами не хранят данные, указанное табличное пространство используется как табличное пространство по умолчанию для вновь создаваемых партиций, если для них не указано иное.
USING INDEX TABLESPACE tablespace_name
Позволяет указать табличное пространство, в котором будет создан индекс, связанный с ограничением 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 (полное заполнение). При меньшем значении fillfactor операции INSERT заполняют страницы таблицы только до указанного процента, оставшееся пространство резервируется для последующих UPDATE, что позволяет обновленной версии строки остаться на той же странице. Это повышает эффективность и увеличивает вероятность обновления без создания новых версий. Для таблиц, которые не обновляются, лучше использовать значение 100, но при частых обновлениях — меньший fillfactor. Этот параметр нельзя установить для TOAST-таблиц.
toast_tuple_target (integer)
Указывает минимальную длину кортежа, при превышении которой PostgreSQL попытается сжать и/или вынести длинные значения столбцов в TOAST-таблицу. Также это целевая длина, ниже которой PostgreSQL будет стараться уменьшить кортеж после перехода к TOAST. Влияет только на новые кортежи и на столбцы с хранением типа External (внешние, которые могут переноситься), Main (основные, которые могут сжиматься) или Extended (расширенные, которые могут и сжиматься, и просто переноситься). Не влияет на уже существующие строки. По умолчанию значение устанавливается так, чтобы в одном блоке помещалось как минимум 4 кортежа (2040 байт при стандартном размере блока). Допустимые значения — от 128 байт до размера блока минус заголовок (по умолчанию — до 8160 байт). Изменение этого параметра может не дать эффекта для очень коротких или очень длинных строк. В большинстве случаев значение по умолчанию является оптимальным. Этот параметр нельзя установить для TOAST-таблиц.
parallel_workers (integer)
Указывает, сколько рабочих процессов можно использовать для параллельного сканирования таблицы. Если не задан, система выберет значение, основываясь на размере таблицы. Фактически используемое число процессов может быть меньше, например, из-за настройки max_worker_processes.
autovacuum_enabled, toast.autovacuum_enabled (boolean)
Включает или отключает работу фонового процесса autovacuum для конкретной таблицы. Если установлено в значении true, autovacuum будет выполнять VACUUM и/или ANALYZE в соответствии с правилами из раздела «Служба AUTOVACUUM». Если установлено в значении false, autovacuum не будет выполняться для этой таблицы, кроме случаев предотвращения переполнения идентификаторов транзакций (смотрите раздел «Предотвращение сбоев при зацикливании счетчика транзакций»). Заметьте, что если глобальный параметр autovacuum выключен, фоновые процессы не будут запускаться вообще, и установка параметра на уровне таблицы не изменит этого. Поэтому обычно нет смысла явно указывать autovacuum_enabled = true.
vacuum_index_cleanup, toast.vacuum_index_cleanup (enum)
Принудительное включение или отключение очистки индексов при выполнении команды VACUUM для этой таблицы. Значение по умолчанию — AUTO. При значении OFF очистка индексов отключена, при значении ON — включена, а при значении AUTO решение принимается динамически при каждом запуске VACUUM. Динамическое поведение позволяет VACUUM избегать ненужного сканирования индексов для удаления очень небольшого количества ненужных записей. Принудительное отключение всей очистки индексов может значительно ускорить работу VACUUM, но также может привести к значительному раздуванию индексов, если изменения в таблице происходят часто. Параметр INDEX_CLEANUP команды VACUUM, если он указан, переопределяет значение этого параметра..
vacuum_truncate, toast.vacuum_truncate (boolean)
Включает или отключает попытки VACUUM удалить пустые страницы в конце таблицы. По умолчанию — true. При true — PostgreSQL будет удалять пустые страницы и возвращать их операционной системе. Для выполнения усечения требуется блокировка уровня ACCESS EXCLUSIVE. Параметр TRUNCATE, заданный в команде VACUUM, переопределяет это значение.
autovacuum_vacuum_threshold, toast.autovacuum_vacuum_threshold (integer)
Значение параметра vacuum_truncate для каждой таблицы. Параметр TRUNCATE в команде VACUUM, если он указан, переопределяет значение этой опции.
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_max_age, оно будет проигнорировано.
autovacuum_freeze_max_age, toast.autovacuum_freeze_max_age (integer)
Задает значение 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_max_age.
autovacuum_multixact_freeze_max_age, toast.autovacuum_multixact_freeze_max_age (integer)
Задает значение 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-таблиц.
Примечания
PostgreSQL автоматически создает индекс для каждого ограничения уникальности (UNIQUE) и первичного ключа (PRIMARY KEY), чтобы обеспечить уникальность. Поэтому нет необходимости явно создавать индекс для столбцов первичного ключа. Смотрите также описание команды CREATE INDEX.
Ограничения UNIQUE и PRIMARY KEY не наследуются в текущей реализации. Это делает комбинацию наследования и ограничений уникальности малопригодной.
Таблица не может содержать более 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, эффект не тот же самый. В стандарте временные таблицы определяются только один раз и автоматически существуют (начиная с пустого содержимого) в каждой сессии, которая в них нуждается. Вместо этого PostgreSQL требует, чтобы каждая сессия выдавала свою собственную команду CREATE TEMPORARY TABLE для каждой временной таблицы, которую необходимо использовать. Это позволяет разным сессиям использовать одно и то же имя временной таблицы для разных целей, тогда как подход стандарта ограничивает все экземпляры данного имени временной таблицы одной и той же структурой таблицы.
Стандартное определение поведения временных таблиц широко игнорируется. Поведение PostgreSQL в этом отношении аналогично поведению нескольких других баз данных SQL.
В стандарте SQL также проводится различие между глобальными и локальными временными таблицами, где локальная временная таблица имеет отдельный набор содержимого для каждого модуля SQL в каждой сессии, хотя ее определение все еще разделяется между сессиями. Поскольку PostgreSQL не поддерживает модули SQL, это различие неприменимо к PostgreSQL.
Ради совместимости, PostgreSQL будет принимать ключевые слова GLOBAL и LOCAL во временной таблице декларации, но они в настоящее время не имеют никакого эффекта. Использование этих ключевых слов не рекомендуется, поскольку будущие версии PostgreSQL могут принять более стандартную интерпретацию их значения.
Пункт ON COMMIT для временных таблиц также напоминает стандартный SQL, но имеет некоторые различия. Если пункт ON COMMIT опущен, SQL указывает, что поведение по умолчанию - ON COMMIT DELETE ROWS. Однако поведение по умолчанию в PostgreSQL - ON COMMIT PRESERVE ROWS. Вариант ON COMMIT DROP не существует в SQL.
Отложенные ограничения уникальности
Когда ограничение UNIQUE или PRIMARY KEY не может быть отложено, PostgreSQL немедленно проверяет уникальность при вставке или изменении строки. Стандарт SQL гласит, что уникальность должна обеспечиваться только в конце оператора, это имеет значение, например, когда одна команда обновляет несколько ключевых значений. Чтобы получить поведение, соответствующее стандарту, объявите ограничение как DEFERRABLE, но не откладывайте его (то есть INITIALLY IMMEDIATE). Помните, что это может быть значительно медленнее, чем немедленная проверка уникальности.
Ограничения проверки столбцов
Стандарт SQL гласит, что CHECK ограничения для столбцов могут относиться только к столбцу, к которому они применяются, только CHECK ограничения таблицы могут ссылаться на несколько столбцов. PostgreSQL не соблюдает это ограничение, он рассматривает ограничения проверки столбца и таблицы одинаково.
Ограничение
Тип ограничения является расширением PostgreSQL.
Действия ограничения внешнего ключа
Возможность указать списки столбцов в действиях внешнего ключа SET DEFAULT и SET NULL является расширением PostgreSQL.
NULL «Ограничение»
NULL «ограничение» (фактически не ограничение) является расширением PostgreSQL для стандарта SQL, которое включено для совместимости с некоторыми другими системами баз данных (и для симметрии с ограничением NOT NULL). Поскольку это значение по умолчанию для любого столбца, его наличие просто шум.
Именование ограничений
Стандарт SQL гласит, что ограничения таблиц и доменов должны иметь имена, уникальные во всей схеме, содержащей таблицу или домен. PostgreSQL более гибок: он требует только уникальности имен ограничений среди ограничений, привязанных к конкретной таблице или домену. Однако эта дополнительная свобода не распространяется на ограничения, основанные на индексах (UNIQUE, PRIMARY KEY, и EXCLUDE ограничения), потому что связанный с ними индекс имеет то же имя, что и ограничение, а имена индексов должны быть уникальными для всех отношений внутри одной схемы.
Наследование
Множественное наследование через предложение INHERITS является расширением языка PostgreSQL. SQL:1999 и последующие версии определяют одиночное наследование с использованием другого синтаксиса и другой семантики. Наследование в стиле SQL:1999 пока не поддерживается PostgreSQL.
Таблицы с нулевыми столбцами
PostgreSQL позволяет создавать таблицу без столбцов (например, CREATE TABLE foo();). Это расширение стандарта SQL, который не допускает таблиц с нулевым количеством столбцов. Таблицы с нулем столбцов сами по себе не очень полезны, но их запрещение создает странные особые случаи для ALTER TABLE DROP COLUMN, поэтому кажется более чистым игнорировать это ограничение спецификации.
Несколько столбцов идентичности
PostgreSQL позволяет таблице иметь более одного столбца идентичности. Стандарт указывает, что таблица может содержать не более одного столбца идентичности. Это смягчено главным образом для того, чтобы обеспечить большую гибкость при внесении изменений в схему или переносе данных. Обратите внимание, что команда INSERT поддерживает только один переопределенный раздел, который применяется ко всему оператору, поэтому наличие нескольких столбцов идентичности с различным поведением поддерживается недостаточно хорошо.
Сгенерированные столбцы
Опции STORED и VIRTUAL не являются стандартными, но также используется другими реализациями SQL. Стандарт SQL не определяет хранение сгенерированных столбцов.
LIKE
Хотя пункт LIKE существует в стандарте SQL, многие из опций, которые PostgreSQL принимает для него, не являются стандартными, и некоторые из стандартных опций не реализованы PostgreSQL.
WITH
Пункт является расширением PostgreSQL , параметры хранения не являются стандартными.
Табличные пространства
Концепция табличных пространств PostgreSQL не является частью стандарта. Следовательно, пункты и являются расширениями.
Типизированные таблицы
Типизированные таблицы реализуют подмножество стандарта SQL. Согласно стандарту, типизированная таблица имеет столбцы, соответствующие базовому составному типу, а также один другой столбец, который является "самоссылочным столбцом". PostgreSQL явно не поддерживает самоссылочные столбцы.
PARTITION BY
PARTITION BY является расширением PostgreSQL.
PARTITION OF
PARTITION OF является расширением PostgreSQL.
Смотрите также
ALTER TABLE, DROP TABLE, CREATE TABLE AS, CREATE TABLESPACE, CREATE TYPE