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 |
NULL |
CHECK ( expression ) [ NO INHERIT ] |
DEFAULT default_expr |
GENERATED ALWAYS AS ( generation_expr ) STORED |
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 ]
and table_constraint is:
[ CONSTRAINT constraint_name ]
{ CHECK ( expression ) [ NO INHERIT ] |
UNIQUE [ NULLS [ NOT ] DISTINCT ] ( column_name [, ... ] ) index_parameters |
PRIMARY KEY ( column_name [, ... ] ) index_parameters |
EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ] |
FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
[ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
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 ) } [ opclass ] [ 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
- Создает типизированную таблицу, структура которой определяется указанным составным типом (при необходимости дополненная схемой). Такая таблица связана со своим типом: например, таблица будет удалена, если будет удален тип (
DROP TYPE ... CASCADE
).При создании типизированной таблицы типы данных столбцов определяются по составному типу и не указываются явно в
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
- Указывает, что столбец не может содержать значения
NULL
.
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
- Создает вычисляемый столбец. В такой столбец нельзя записывать значения, а при чтении возвращается результат указанного выражения.
Ключевое слово
STORED
обязательно и означает, что значение вычисляется при записи и сохраняется на диске.Выражение генерации может ссылаться на другие столбцы таблицы, но не на другие вычисляемые столбцы. Все используемые функции и операторы должны быть неизменяемыми. Ссылки на другие таблицы не допускаются.
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 [, ...]) ]
(ограничение таблицы)- Требует, чтобы одна или несколько столбцов содержали только уникальные значения. Уникальное ограничение таблицы ведет себя так же, как и ограничение столбца, но может охватывать несколько столбцов. Оно обеспечивает, что любые две строки различаются хотя бы в одном из указанных столбцов.
По умолчанию значения
NULL
не считаются равными, если не указаноNULLS NOT DISTINCT
.Каждое уникальное ограничение должно включать другой набор столбцов, нежели любой другой
UNIQUE
илиPRIMARY KEY
в той же таблице (иначе ограничение считается избыточным и отбрасывается).При установлении ограничения уникальности в многоуровневой иерархии партиционирования в определение ограничения должны включаться все столбцы ключа партиционирования целевой партиционированной таблицы, а также столбцы всех подчиненных партиционированных таблиц.
При создании уникального ограничения автоматически создается уникальный B-tree индекс по соответствующим столбцам, перечисленных в ограничении. Созданный индекс наследует имя ограничения уникальности.
Необязательный
INCLUDE
добавляет к этому индексу один или несколько столбцов, составляющих просто «дополнительную нагрузку»: для них уникальность не будет требоваться, и искать значения в них по данному индексу нельзя. Однако их содержимое может быть получено при сканировании только индекса. Хотя ограничение не применяется к этим столбцам, оно от них зависит. Поэтому некоторые действия, такие какDROP COLUMN
, могут привести к каскадному удалению ограничения и индекса.
PRIMARY KEY
(ограничение столбца)PRIMARY KEY ( column_name [, ... ] ) [ INCLUDE ( column_name [, ...]) ]
(ограничение таблицы)- Требует, чтобы указанные столбцы содержали только уникальные и
Ограничение должно включать уникальный набор столбцов, отличный от всех других
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 ) ]
- Обеспечивает, что если две строки сравниваются по указанным столбцам или выражениям с помощью заданных операторов, то не все такие сравнения возвращают
TRUE
. Если все операторы проверяют равенство,EXCLUDE
эквивалентенUNIQUE
, но работает медленнее. ОднакоEXCLUDE
позволяет задавать более общие ограничения. Например, можно указать, чтобы два круга не пересекались (используя оператор&&
). Операторы должны быть коммутативны.Исключающие ограничения реализуются посредством индекса, имеющего то же имя, что и ограничение, поэтому каждый указанный оператор должен быть связан с соответствующим классом оператора для метода доступа к индексам
index_method
. Каждый элемент exclude_element задает столбец индекса, так что он может дополнительно указывать сортировку, класс оператора, параметры класса оператора и/или опции упорядочивания, подробности приведены вCREATE INDEX
.Метод доступа должен поддерживать
amgettuple
(смотрите главу «Определение интерфейса для индексных методов доступа»), то есть GIN не поддерживается. Хотя B-tree и хеш разрешены, они не дают преимуществ по сравнению с обычнымUNIQUE
. Обычно используются GiST или SP-GiST.WHERE
позволяет задать исключающее ограничение только на подмножество строк (создается частичный индекс). Скобки обязательны.
REFERENCES reftable [ ( refcolumn ) ] [ MATCH matchtype ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ]
(ограничение столбца)FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH matchtype ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ]
(ограничение таблицы)- Задают ограничение внешнего ключа, которое требует, чтобы один или несколько столбцов новой таблицы содержали только значения, которые присутствуют в соответствующих столбцах какой-либо строки указанной (ссылаемой) таблицы. Если список
Значения, вставляемые в ссылающиеся столбцы, сравниваются со значениями в ссылаемой таблице и столбцах в соответствии с указанным типом сопоставления. Существует три типа сопоставления:
MATCH FULL
,MATCH PARTIAL
иMATCH SIMPLE
(по умолчанию используется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 [ ( column_name [, ... ] ) ]
: УстанавливаетNULL
во всех ссылающихся столбцах или только в указанном подмножестве столбцов. Задание подмножества столбцов допустимо только для действийON DELETE
.SET DEFAULT [ ( column_name [, ... ] ) ]
: Устанавливает значения по умолчанию во всех ссылающихся столбцах или в указанном подмножестве столбцов. Задание подмножества столбцов также допустимо только для действийON DELETE
. Если значения по умолчанию неNULL
, в ссылаемой таблице должна существовать строка, соответствующая этим значениям, иначе операция завершится ошибкой.Если ссылаемые столбцы часто изменяются, имеет смысл создать индекс на ссылающихся столбцах, чтобы действия ссылочного контроля, связанные с ограничением внешнего ключа, выполнялись эффективнее.
DEFERRABLE
NOT DEFERRABLE
- Определяет, может ли проверка ограничения быть отложена. Ограничение, заданное как
NOT DEFERRABLE
, проверяется немедленно после выполнения каждой команды. Ограничения, заданные какDEFERRABLE
, могут быть проверены в конце транзакции (с помощью команды SET CONSTRAINTS). По умолчанию используетсяNOT DEFERRABLE
.В настоящее время только ограничения типов
UNIQUE
,PRIMARY KEY
,EXCLUDE
иREFERENCES
(внешний ключ) поддерживают это выражение. ОграниченияNOT NULL
иCHECK
отложены быть не могут. Обратите внимание: отложенные ограничения не могут использоваться как механизм разрешения конфликтов в выраженииINSERT ... ON CONFLICT DO UPDATE
.
INITIALLY IMMEDIATE
INITIALLY DEFERRED
- Если ограничение может быть отложено, это выражение указывает, когда по умолчанию выполнять его проверку. Если указано
INITIALLY IMMEDIATE
, ограничение проверяется после каждой инструкции. Это поведение по умолчанию. Если указаноINITIALLY DEFERRED
, ограничение проверяется только в конце транзакции. Время проверки ограничения можно изменить с помощью команды SET CONSTRAINTS.
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 (полное заполнение). При меньшем значении
toast_tuple_target
(integer
)- Указывает минимальную длину кортежа, при превышении которой PostgreSQL попытается сжать и/или вынести длинные значения столбцов в TOAST-таблицу. Также это целевая длина, ниже которой PostgreSQL будет стараться уменьшить кортеж после перехода к TOAST. Влияет только на новые кортежи и на столбцы с хранением типа External (внешние, которые могут переноситься), Main (основные, которые могут сжиматься) или Extended (расширенные, которые могут и сжиматься, и просто переноситься). Не влияет на уже существующие строки. По умолчанию значение устанавливается так, чтобы в одном блоке помещалось как минимум 4 кортежа (2040 байт при стандартном размере блока). Допустимые значения — от 128 байт до размера блока минус заголовок (по умолчанию — до 8160 байт). Изменение этого параметра может не дать эффекта для очень коротких или очень длинных строк. В большинстве случаев значение по умолчанию является оптимальным. Этот параметр нельзя установить для TOAST-таблиц.
parallel_workers
(integer
)- Указывает, сколько рабочих процессов можно использовать для параллельного сканирования таблицы. Если не задан, система выберет значение, основываясь на размере таблицы. Фактически используемое число процессов может быть меньше, например, из-за настройки
autovacuum_enabled
,toast.autovacuum_enabled
(boolean
)- Включает или отключает работу фонового процесса
vacuum_index_cleanup
,toast.vacuum_index_cleanup
(enum
)- Управляет тем, будет ли
Если отключить очистку индексов,
VACUUM
может выполняться значительно быстрее, но это может привести к сильной фрагментации индексов при частых изменениях таблицы. ПараметрINDEX_CLEANUP
в явном вызове VACUUM имеет приоритет над этим параметром.
vacuum_truncate
,toast.vacuum_truncate
(boolean
)- Включает или отключает попытки
autovacuum_vacuum_threshold
,toast.autovacuum_vacuum_threshold
(integer
)- Задает значение параметра
autovacuum_vacuum_scale_factor
,toast.autovacuum_vacuum_scale_factor
(floating point
)- Задает значение параметра
autovacuum_vacuum_insert_threshold
,toast.autovacuum_vacuum_insert_threshold
(integer
)- Задает значение параметра
autovacuum_vacuum_insert_scale_factor
,toast.autovacuum_vacuum_insert_scale_factor
(floating point
)- Задает значение параметра
autovacuum_analyze_threshold
(integer
)- Задает значение параметра
autovacuum_analyze_scale_factor
(floating point
)- Задает значение параметра
autovacuum_vacuum_cost_delay
,toast.autovacuum_vacuum_cost_delay
(floating point
)- Задает значение параметра
autovacuum_vacuum_cost_limit
,toast.autovacuum_vacuum_cost_limit
(integer
)- Задает значение параметра
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
ограничения), потому что связанный с ними индекс имеет то же имя, что и ограничение, а имена индексов должны быть уникальными для всех отношений внутри одной схемы.
В настоящее время PostgreSQL вообще не регистрирует имена для NOT NULL
ограничений, поэтому они не подпадают под ограничение уникальности. Это может измениться в будущих версиях.
Наследование
Множественное наследование через предложение INHERITS
является расширением языка PostgreSQL. SQL:1999 и последующие версии определяют одиночное наследование с использованием другого синтаксиса и другой семантики. Наследование в стиле SQL:1999 пока не поддерживается PostgreSQL.
Таблицы с нулевыми столбцами
PostgreSQL позволяет создавать таблицу без столбцов (например, CREATE TABLE foo();
). Это расширение стандарта SQL, который не допускает таблиц с нулевым количеством столбцов. Таблицы с нулем столбцов сами по себе не очень полезны, но их запрещение создает странные особые случаи для ALTER TABLE DROP COLUMN
, поэтому кажется более чистым игнорировать это ограничение спецификации.
Несколько столбцов идентичности
PostgreSQL позволяет таблице иметь более одного столбца идентичности. Стандарт указывает, что таблица может содержать не более одного столбца идентичности. Это смягчено главным образом для того, чтобы обеспечить большую гибкость при внесении изменений в схему или переносе данных. Обратите внимание, что команда INSERT
поддерживает только один переопределенный раздел, который применяется ко всему оператору, поэтому наличие нескольких столбцов идентичности с различным поведением поддерживается недостаточно хорошо.
Сгенерированные столбцы
Опция STORED
не является стандартной, но также используется другими реализациями 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