CREATE TABLE#

CREATE TABLE

CREATE TABLE

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

Синтаксис

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name ( [
  { column_name data_type [ 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 также автоматически создает тип данных, который представляет составной тип, соответствующий одной строке таблицы. Поэтому таблицы не могут иметь того же имени, что и существующий тип данных в той же схеме.

Опциональные предложения ограничений определяют ограничения (тесты), которым должны удовлетворять новые или обновленные строки для успешного выполнения операции вставки или обновления. Ограничение - это объект SQL, который помогает определить набор допустимых значений в таблице различными способами.

Существует два способа определения ограничений: ограничения таблицы и ограничения столбца. Ограничение столбца определяется как часть определения столбца. Определение ограничения таблицы не привязано к конкретному столбцу и может охватывать более одного столбца. Каждое ограничение столбца также может быть записано как ограничение таблицы; ограничение столбца является только удобством в нотации для использования, когда ограничение влияет только на один столбец.

Чтобы создать таблицу, необходимо иметь привилегию USAGE на всех типах столбцов или на тип, указанный в предложении OF.

Параметры

TEMPORARY or TEMP

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

Демон автоочистки autovacuum daemon не может получить доступ к временным таблицам и, следовательно, не может выполнять операции очистки или анализа. По этой причине соответствующие операции очистки и анализа должны выполняться с помощью SQL-команд сессии. Например, если временная таблица будет использоваться в сложных запросах, рекомендуется запустить команду ANALYZE для временной таблицы после ее заполнения.

Опционально, перед TEMPORARY или TEMP можно написать GLOBAL или LOCAL. В настоящее время это не имеет значения в Tantor SE и является устаревшим; см. Compatibility ниже.

UNLOGGED

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

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

IF NOT EXISTS

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

table_name

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

OF type_name

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

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

column_name

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

data_type

Тип данных столбца. Это может включать спецификаторы массива. Для получения дополнительной информации о типах данных, поддерживаемых Tantor SE, см. Глава 8.

COLLATE collation

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

COMPRESSION compression_method

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

INHERITS ( parent_table [, ... ] )

Необязательная фраза INHERITS указывает список таблиц, от которых новая таблица автоматически наследует все столбцы. Родительские таблицы могут быть обычными таблицами или внешними таблицами.

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

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

Все ограничения CHECK объединяются практически таким же образом, как и столбцы: если у нескольких родительских таблиц и/или нового определения таблицы есть ограничения CHECK с одинаковыми именами, эти ограничения должны иметь одно и то же выражение проверки, иначе будет выдана ошибка. Ограничения с одинаковым именем и выражением будут объединены в одну копию. Ограничение, помеченное как NO INHERIT в родительской таблице, не будет учитываться. Обратите внимание, что безымянное ограничение CHECK в новой таблице никогда не будет объединено, так как для него всегда будет выбрано уникальное имя.

Все настройки столбца STORAGE также копируются из родительских таблиц.

Если столбец в родительской таблице является столбцом идентификатора, то это свойство не наследуется. Столбец в дочерней таблице может быть объявлен столбцом идентификатора, если это необходимо.

PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ opclass ] [, ...] )

Опциональное предложение PARTITION BY указывает стратегию разделения таблицы. Таблица, созданная таким образом, называется партицированной таблицей. В круглых скобках перечислены столбцы или выражения, которые формируют ключ разделения для таблицы. При использовании партицирования по диапазону или хешу, ключ разделения может включать несколько столбцов или выражений (до 32, но это ограничение может быть изменено при построении Tantor SE), но для разделения по списку ключ разделения должен состоять из одного столбца или выражения.

Range and list partitioning require a btree operator class, while hash partitioning requires a hash operator class. If no operator class is specified explicitly, the default operator class of the appropriate type will be used; if no default operator class exists, an error will be raised. When hash partitioning is used, the operator class used must implement support function 2 (see Раздел 36.15.3 for details). Диапазонное и списочное разделение требуют класса операторов btree, в то время как хеш-разделение требует класса операторов hash. Если класс операторов не указан явно, будет использоваться класс операторов по умолчанию соответствующего типа; если класс операторов по умолчанию не существует, будет вызвана ошибка. При использовании хеш-разделения используемый класс операторов должен реализовывать функцию поддержки 2 (см. Раздел 36.15.3 для получения подробной информации).

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

Переделанные таблицы не поддерживают ограничения EXCLUDE; однако, вы можете определить эти ограничения на отдельных разделах.

См. Раздел 5.11 для получения дополнительной информации о разделении таблицы.

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 не может быть указан для диапазонных секций.

При создании диапазонного раздела нижняя граница, указанная с помощью тега FROM, является инклюзивной границей, в то время как верхняя граница, указанная с помощью тега TO, является исключительной границей. То есть значения, указанные в списке FROM, являются допустимыми значениями соответствующих столбцов ключа раздела для этого раздела, в то время как значения в списке TO - нет. Обратите внимание, что это утверждение должно быть понято в соответствии с правилами сравнения построчно (Раздел 9.24.5). Например, для раздела 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, которые не являются реальными значениями, которые могут быть сохранены, а скорее они являются способами сказать, что значение неограничено. MAXVALUE можно рассматривать как большее любого другого значения, включая "бесконечность", а MINVALUE как меньшее любого другого значения, включая "минус бесконечность". Таким образом, диапазон FROM ('бесконечность') TO (MAXVALUE) не является пустым диапазоном; он позволяет сохранить ровно одно значение - "бесконечность".

Если указано значение DEFAULT, таблица будет создана как раздел по умолчанию родительской таблицы. Эта опция недоступна для таблиц, разделенных по хешу. Значение ключа раздела, не подходящее ни в один другой раздел данного родителя, будет направлено в раздел по умолчанию.

Когда у таблицы есть существующий раздел DEFAULT и к ней добавляется новый раздел, раздел по умолчанию должен быть просканирован, чтобы убедиться, что в нем нет строк, которые должны быть помещены в новый раздел. Если в разделе по умолчанию содержится большое количество строк, это может занять много времени. Сканирование будет прне указано, если раздел по умолчанию является внешней таблицей или если у него есть ограничение, которое доказывает, что он не может содержать строки, которые должны быть помещены в новый раздел.

При создании хеш-раздела необходимо указать модуль и остаток. Модуль должен быть положительным целым числом, а остаток - неотрицательным целым числом, меньшим модуля. Обычно, при первоначальной настройке таблицы с хеш-разделением, следует выбрать модуль, равный количеству секций, и присвоить каждой таблице одинаковый модуль и различный остаток (см. примеры ниже). Однако, не требуется, чтобы каждый раздел имела одинаковый модуль, только каждый модуль, который встречается среди секций таблицы с хеш-разделением, должен быть делителем следующего большего модуля. Это позволяет увеличивать количество секций постепенно, не перемещая все данные сразу. Например, предположим, у вас есть таблица с хеш-разделением с 8 разделами, каждый из которых имеет модуль 8, но вы обнаруживаете необходимость увеличить количество секций до 16. Вы можете отсоединить один из секций с модулем 8, создать два новых раздела с модулем 16, охватывающих ту же часть пространства ключей (один с остатком, равным остатку отсоединенного раздела, а другой с остатком, равным этому значению плюс 8), и заполнить их данными. Затем вы можете повторить это - возможно, в более позднее время - для каждого раздела с модулем 8, пока не останется ни одного. Хотя это все равно может потребовать большого объема перемещения данных на каждом шаге, это все равно лучше, чем создавать совершенно новую таблицу и перемещать все данные сразу.

Все секции должны иметь те же имена столбцов и типы, что и таблица, к которой они принадлежат. Изменения имен или типов столбцов в разделенной таблице автоматически распространяются на все секции. Ограничения CHECK будут автоматически наследоваться каждым разделом, но отдельная секция может указывать дополнительные ограничения CHECK; дополнительные ограничения с тем же именем и условием, что и в родительском разделе, будут объединены с родительским ограничением. Значения по умолчанию можно указать отдельно для каждой секции. Однако следует отметить, что значение по умолчанию секции не применяется при вставке кортежа через разделенную таблицу.

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

Операции, такие как TRUNCATE, которые обычно влияют на таблицу и все ее наследуемые дочерние элементы, будут каскадно применяться ко всем секциям, но также могут быть выполнены на отдельной секции.

Обратите внимание, что создание секции с использованием PARTITION OF требует получения ACCESS EXCLUSIVE блокировки на родительской партицированной таблице. Точно так же, удаление секции с помощью DROP TABLE требует получения ACCESS EXCLUSIVE блокировки на родительской таблице. Возможно использовать ALTER TABLE ATTACH/DETACH PARTITION для выполнения этих операций с более слабой блокировкой, тем самым уменьшая вмешательство в параллельные операции на партицированной таблице.

LIKE source_table [ like_option ... ]

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

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

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

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

INCLUDING COMMENTS

Комментарии для скопированных столбцов, ограничений и индексов будут скопированы. По умолчанию комментарии исключаются, что приводит к отсутствию комментариев у скопированных столбцов и ограничений в новой таблице.

INCLUDING COMPRESSION

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

INCLUDING CONSTRAINTS

Все ограничения CHECK будут скопированы. Нет различия между ограничениями столбцов и ограничениями таблицы. Ограничения на непустоту всегда копируются в новую таблицу.

INCLUDING DEFAULTS

По умолчанию будут скопированы выражения для определений скопированных столбцов. В противном случае, выражения по умолчанию не копируются, что приводит к тому, что скопированные столбцы в новой таблице имеют значения null по умолчанию. Обратите внимание, что копирование значений по умолчанию, которые вызывают функции модификации базы данных, такие как nextval, может создать функциональную связь между исходной и новой таблицами.

INCLUDING GENERATED

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

INCLUDING IDENTITY

Все спецификации идентификаторов скопированных определений столбцов будут скопированы. Для каждого столбца с идентификатором новой таблицы создается новая последовательность, отдельная от последовательностей, связанных со старой таблицей.

INCLUDING INDEXES

Создаются индексы, ограничения PRIMARY KEY, UNIQUE и EXCLUDE на исходной таблице на новой таблице. Имена для новых индексов и ограничений выбираются в соответствии с правилами по умолчанию, независимо от того, как они были названы в оригинале. (Такое поведение предотвращает возможные ошибки дублирования имен для новых индексов).

INCLUDING STATISTICS

Все расширенные статистические данные копируются в новую таблицу.

INCLUDING STORAGE

STORAGE настройки для скопированных определений столбцов будут скопированы. По умолчанию исключаются STORAGE настройки, что приводит к тому, что скопированные столбцы в новой таблице имеют типовые настройки по умолчанию. Дополнительную информацию о STORAGE настройках см. в разделе Раздел 71.2.

INCLUDING ALL

INCLUDING ALL - это сокращенная форма, выбирающая все доступные индивидуальные опции. (Может быть полезно написать отдельные предложения EXCLUDING после INCLUDING ALL, чтобы выбрать все, кроме некоторых конкретных опций).

Предложение LIKE также может использоваться для копирования определений столбцов из представлений, внешних таблиц или составных типов. Неприменимые опции (например, INCLUDING INDEXES из представления) игнорируются.

CONSTRAINT constraint_name

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

NOT NULL

Столбец не может содержать пустые значения.

NULL

Столбец может содержать значения null. Это значение по умолчанию.

Это предложение предоставляется только для совместимости с нестандартными базами данных SQL. Его использование не рекомендуется в новых приложениях.

CHECK ( expression ) [ NO INHERIT ]

Предложение CHECK определяет выражение, которое должны удовлетворять новые или обновленные строки для успешного выполнения операции вставки или обновления. Выражения, оценивающиеся как TRUE или UNKNOWN, успешно выполняются. Если любая строка операции вставки или обновления дает ложный результат, возникает исключение ошибки, и вставка или обновление не изменяет базу данных. Проверочное ограничение, указанное как ограничение столбца, должно ссылаться только на значение этого столбца, в то время как выражение, появляющееся в ограничении таблицы, может ссылаться на несколько столбцов.

В настоящее время выражения CHECK не могут содержать подзапросы или ссылаться на переменные, отличные от столбцов текущей строки (см. Раздел 5.4.1). Можно ссылаться на системный столбец tableoid, но не на другие системные столбцы.

Ограничение, помеченное тегом NO INHERIT, не будет распространяться на дочерние таблицы.

Когда у таблицы есть несколько ограничений CHECK, они будут проверяться для каждой строки в алфавитном порядке по имени, после проверки ограничений NOT NULL. (В версиях PostgreSQL до 9.5 не соблюдался никакой определенный порядок выполнения ограничений CHECK.)

DEFAULT default_expr

Предложение DEFAULT назначает значение данных по умолчанию для столбца, в котором она появляется в определении столбца. Значение может быть любым выражением без переменных (в частности, перекрестные ссылки на другие столбцы в текущей таблице не допускаются). Подзапросы также не допускаются. Тип данных выражения по умолчанию должен соответствовать типу данных столбца.

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

GENERATED ALWAYS AS ( generation_expr ) STORED

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

Ключевое слово STORED требуется для обозначения того, что столбец будет вычисляться при записи и будет храниться на диске.

Выражение генерации может ссылаться на другие столбцы в таблице, но не на другие сгенерированные столбцы. Все использованные функции и операторы должны быть неизменяемыми. Ссылки на другие таблицы не допускаются.

GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ]

С помощью этого предложения столбец создается как identity column. К нему будет автоматически присоединена неявная последовательность, и в новых строках столбец будет автоматически заполняться значениями из этой последовательности. Такой столбец неявно NOT NULL.

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

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

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

Необязательная фраза sequence_options может быть использована для переопределения параметров последовательности. См. CREATE SEQUENCE для получения подробной информации.

UNIQUE [ NULLS [ NOT ] DISTINCT ] (column constraint)
UNIQUE [ NULLS [ NOT ] DISTINCT ] ( column_name [, ... ] ) [ INCLUDE ( column_name [, ...]) ] (table constraint)

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

Для целей уникального ограничения, значения null не считаются равными, если не указано NULLS NOT DISTINCT.

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

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

Добавление уникального ограничения автоматически создаст уникальный индекс btree на столбце или группе столбцов, используемых в ограничении.

Необязательная фраза INCLUDE добавляет в этот индекс одну или несколько колонок, которые являются просто payload: уникальность на них не накладывается, и по ним нельзя выполнять поиск в индексе. Однако их можно получить с помощью индексного сканирования. Обратите внимание, что хотя ограничение не накладывается на включенные столбцы, оно все равно зависит от них. Следовательно, некоторые операции с такими столбцами (например, DROP COLUMN) могут вызвать каскадное удаление ограничений и индексов.

PRIMARY KEY (column constraint)
PRIMARY KEY ( column_name [, ... ] ) [ INCLUDE ( column_name [, ...]) ] (table constraint)

Ограничение PRIMARY KEY указывает, что столбец или столбцы таблицы могут содержать только уникальные (неповторяющиеся), ненулевые значения. Для таблицы может быть указан только один первичный ключ, как ограничение столбца или ограничение таблицы.

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

PRIMARY KEY обеспечивает те же ограничения на данные, что и комбинация UNIQUE и NOT NULL. Однако, идентификация набора столбцов в качестве первичного ключа также предоставляет метаданные о проектировании схемы, поскольку первичный ключ подразумевает, что другие таблицы могут полагаться на этот набор столбцов в качестве уникального идентификатора для строк.

Когда они размещаются на разделенной таблице, ограничения PRIMARY KEY совместно используют ограничения, описанные ранее для ограничений UNIQUE.

Добавление ограничения PRIMARY KEY автоматически создаст уникальный индекс btree на столбце или группе столбцов, используемых в ограничении.

Необязательная фраза INCLUDE добавляет в этот индекс одну или несколько колонок, которые являются просто payload: уникальность на них не накладывается, и по ним нельзя выполнять поиск в индексе. Однако их можно получить с помощью индексного сканирования. Обратите внимание, что хотя ограничение не накладывается на включенные столбцы, оно все равно зависит от них. Следовательно, некоторые операции с такими столбцами (например, DROP COLUMN) могут вызвать каскадное удаление ограничений и индексов.

EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ]

Предложение EXCLUDE определяет ограничение исключения, которое гарантирует, что если любые две строки сравниваются по указанным столбцам или выражениям с использованием указанных операторов, не все эти сравнения будут возвращать TRUE. Если все указанные операторы проверяют равенство, это эквивалентно ограничению UNIQUE, хотя обычное уникальное ограничение будет работать быстрее. Однако ограничения исключения могут задавать более общие ограничения, чем простое равенство. Например, вы можете указать ограничение, что в таблице нет двух строк, содержащих перекрывающиеся окружности (см. Раздел 8.8) с использованием оператора &&.

Все ограничения на исключение реализуются с использованием индекса, поэтому каждый указанный оператор должен быть связан с соответствующим классом операторов (см. Раздел 11.10) для метода доступа к индексу index_method. Операторы должны быть коммутативными. Каждый exclude_element может дополнительно указывать класс операторов и/или опции сортировки; эти параметры подробно описаны в разделе CREATE INDEX.

Доступный метод должен поддерживать amgettuple (см. Глава 62); на данный момент это означает, что GIN не может быть использован. Хотя это допускается, нет смысла использовать B-дерево или хеш-индексы с исключающим ограничением, потому что это ничего не делает лучше, чем обычное уникальное ограничение. Поэтому на практике метод доступа всегда будет GiST или SP-GiST.

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

REFERENCES reftable [ ( refcolumn ) ] [ MATCH matchtype ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] (column constraint)
FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH matchtype ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] (table constraint)

Эти предложения определяют ограничение внешнего ключа, которое требует, чтобы группа из одного или нескольких столбцов новой таблицы содержала только значения, соответствующие значениям в указанных столбцах некоторой строки указанной таблицы. Если список refcolumn опущен, используется первичный ключ таблицы reftable. В противном случае список refcolumn должен ссылаться на столбцы недеферируемого уникального или первичного ключа или быть столбцами неполного уникального индекса. Пользователь должен иметь разрешение REFERENCES на указанную таблицу (либо на всю таблицу, либо на конкретные указанные столбцы). Добавление ограничения внешнего ключа требует блокировки SHARE ROW EXCLUSIVE на указанной таблице. Обратите внимание, что ограничения внешнего ключа не могут быть определены между временными и постоянными таблицами.

Вставленное значение в ссылочный столбец сравнивается со значениями таблицы-источника и ссылочных столбцов с использованием заданного типа сопоставления. Существуют три типа сопоставления: MATCH FULL, MATCH PARTIAL, и MATCH SIMPLE (который является типом по умолчанию). MATCH FULL не позволяет одному столбцу многоколоночного внешнего ключа быть null, если все столбцы внешнего ключа null; если все они null, то строке не требуется совпадение в ссылочной таблице. MATCH SIMPLE позволяет любому из столбцов внешнего ключа быть null; если хотя бы один из них null, то строке не требуется совпадение в ссылочной таблице. MATCH PARTIAL пока не реализован. (Конечно, ограничения NOT NULL могут быть применены к ссылочному столбцу, чтобы предотвратить возникновение этих случаев).

Кроме того, когда данные в ссылочных столбцах изменяются, выполняются определенные действия с данными в столбцах этой таблицы. Предложение ON DELETE указывает действие, которое должно быть выполнено при удалении ссылочной строки из ссылочной таблицы. Аналогично, предложение ON UPDATE указывает действие, которое должно быть выполнено при обновлении ссылочного столбца в ссылочной таблице на новое значение. Если строка обновляется, но ссылочный столбец фактически не изменяется, никаких действий не выполняется. Референциальные действия, отличные от проверки NO ACTION, не могут быть отложены, даже если ограничение объявлено отложенным. Для каждой предложения возможны следующие действия:

NO ACTION

Сгенерировать ошибку, указывающую на то, что удаление или обновление приведет к нарушению ограничения внешнего ключа. Если ограничение отложено, эта ошибка будет сгенерирована во время проверки ограничения, если все еще существуют ссылочные строки. Это действие по умолчанию.

RESTRICT

Сгенерировать ошибку, указывающую на нарушение ограничения внешнего ключа при удалении или обновлении. Это то же самое, что и NO ACTION, за исключением того, что проверка не может быть отложена.

CASCADE

Удалите все строки, ссылающиеся на удаленную строку, или обновите значения ссылающегося столбца(ов) на новые значения ссылаемых столбцов, соответственно.

SET NULL [ ( column_name [, ... ] ) ]

Установите все ссылочные столбцы или указанный поднабор ссылочных столбцов в значение null. Поднабор столбцов может быть указан только для действий ON DELETE.

SET DEFAULT [ ( column_name [, ... ] ) ]

Установите все столбцы ссылки или указанный подмножество столбцов ссылки на их значения по умолчанию. Подмножество столбцов может быть указано только для действий ON DELETE. (В таблице-источнике должна быть строка, соответствующая значениям по умолчанию, если они не являются нулевыми, иначе операция завершится неудачей).

Если ссылочные столбцы часто изменяются, может быть разумным добавить индекс к ссылочным столбцам, чтобы референциальные действия, связанные с ограничением внешнего ключа, могли выполняться более эффективно.

DEFERRABLE
NOT 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. См. Глава 61 для получения дополнительной информации. Если этот параметр не указан, для новой таблицы выбирается метод доступа по умолчанию. См. default_table_access_method для получения дополнительной информации.

WITH ( storage_parameter [= value] [, ... ] )

Это предложение определяет необязательные параметры хранения для таблицы или индекса; см. Storage Parameters ниже для получения дополнительной информации. Для обратной совместимости предложение WITH для таблицы также может включать OIDS=FALSE для указания того, что строки новой таблицы не должны содержать OID (идентификаторы объектов), OIDS=TRUE больше не поддерживается.

WITHOUT OIDS

Это обратно совместимый синтаксис для объявления таблицы WITHOUT OIDS, создание таблицы WITH OIDS больше не поддерживается.

ON COMMIT

Поведение временных таблиц в конце блока транзакции можно контролировать с помощью ON COMMIT. Три варианта:

PRESERVE ROWS

Не выполняется никаких специальных действий в конце транзакций. Это является поведением по умолчанию.

DELETE ROWS

Все строки во временной таблице будут удалены в конце каждого блока транзакции. По сути, автоматически выполняется TRUNCATE при каждом коммите. При использовании на разделенной таблице это не распространяется на ее секции.

DROP

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

TABLESPACE tablespace_name

Вместо tablespace_name указывается имя табличнoго пространства, в которой будет создана новая таблица. Если не указано, будет использовано значение default_tablespace, или temp_tablespaces, если таблица является временной. Для разделенных таблиц, так как для самой таблицы не требуется хранение, указанное табличное пространство заменяет default_tablespace в качестве табличнoго пространства по умолчанию для любых новых созданных секций, если явно не указано другое табличнoe пространствo.

USING INDEX TABLESPACE tablespace_name

Этот раздел позволяет выбрать табличное пространство, в котором будет создан индекс, связанный с ограничением UNIQUE, PRIMARY KEY или EXCLUDE. Если не указано, будет использован default_tablespace, или temp_tablespaces, если таблица временная.

Параметры хранения

Предложение WITH может указывать параметры хранения для таблиц и для индексов, связанных с ограничением UNIQUE, PRIMARY KEY или EXCLUDE. Параметры хранения для индексов описаны в разделе CREATE INDEX. В настоящее время доступны следующие параметры хранения для таблиц. Для многих из этих параметров, как показано, существует дополнительный параметр с тем же именем, предшествующий префиксу toast., который управляет поведением вторичной таблицы TOAST таблицы, если таковая имеется (см. раздел Раздел 71.2 для получения дополнительной информации о TOAST). Если значение параметра таблицы установлено, а эквивалентный параметр toast. не установлен, TOAST-таблица будет использовать значение параметра таблицы. Указание этих параметров для разделенных таблиц не поддерживается, но вы можете указать их для отдельных листовых секций.

fillfactor (integer)

Значение fillfactor для таблицы представляет собой процентное значение от 10 до 100. Значение 100 (полная упаковка) является значением по умолчанию. При указании меньшего значения fillfactor, операции INSERT упаковывают страницы таблицы только до указанного процента; оставшееся пространство на каждой странице зарезервировано для обновления строк на этой странице. Это дает возможность UPDATE разместить обновленную копию строки на той же странице, что более эффективно, чем размещение ее на другой странице, и увеличивает вероятность обновления только кучи. Для таблицы, записи в которой никогда не обновляются, лучший выбор - полная упаковка, но для таблиц с частыми обновлениями подходят меньшие значения fillfactor. Этот параметр не может быть установлен для таблиц TOAST.

toast_tuple_target (integer)

toast_tuple_target определяет минимальную длину кортежа, необходимую перед попыткой сжатия и/или перемещения длинных значений столбцов в таблицы TOAST, и также является целевой длиной, которую мы пытаемся сократить ниже, как только начинается процесс сжатия. Это влияет на столбцы, помеченные как External (для перемещения), Main (для сжатия) или Extended (для обоих) и применяется только к новым кортежам. На существующие строки это не влияет. По умолчанию этот параметр установлен так, чтобы разрешить не менее 4 кортежей на блок, что при размере блока по умолчанию составит 2040 байт. Допустимые значения находятся между 128 байтами и (размер блока - заголовок), по умолчанию 8160 байт. Изменение этого значения может быть бесполезным для очень коротких или очень длинных строк. Обратите внимание, что значение по умолчанию часто близко к оптимальному, и возможно, что установка этого параметра может иметь отрицательные последствия в некоторых случаях. Этот параметр не может быть установлен для таблиц TOAST.

parallel_workers (integer)

Это устанавливает количество рабочих процессов, которые должны быть использованы для помощи в параллельном сканировании этой таблицы. Если не установлено, система определит значение на основе размера отношения. Фактическое количество рабочих процессов, выбранных планировщиком или утилитами, которые используют параллельное сканирование, может быть меньше, например, из-за установки max_worker_processes.

autovacuum_enabled, toast.autovacuum_enabled (boolean)

Включает или отключает процесс автоочистки для конкретной таблицы. Если значение true, то демон автоочистки будет выполнять автоматические операции VACUUM и/или ANALYZE на этой таблице в соответствии с правилами, обсуждаемыми в разделе Раздел 24.1.6. Если значение false, то эта таблица не будет автоматически очищаться, за исключением предотвращения зацикливания идентификатора транзакции. См. раздел Раздел 24.1.5 для получения дополнительной информации о предотвращении зацикливания. Обратите внимание, что демон автоочистки не работает вообще (за исключением предотвращения зацикливания идентификатора транзакции), если параметр autovacuum установлен в значение false; установка параметров хранения для отдельных таблиц не переопределяет это. Поэтому редко имеет смысл явно устанавливать этот параметр хранения в значение true, только чтобы затем установить его в значение false.

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, то операции VACUUM и автоочистка выполняют усечение, а дисковое пространство для усеченных страниц возвращается операционной системе. Обратите внимание, что для усечения требуется блокировка ACCESS EXCLUSIVE на таблицу. Параметр TRUNCATE команды VACUUM, если указан, переопределяет значение этой опции.

autovacuum_vacuum_threshold, toast.autovacuum_vacuum_threshold (integer)

Значение для каждой таблицы для параметра autovacuum_vacuum_threshold.

autovacuum_vacuum_scale_factor, toast.autovacuum_vacuum_scale_factor (floating point)

Значение для каждой таблицы параметра autovacuum_vacuum_scale_factor.

autovacuum_vacuum_insert_threshold, toast.autovacuum_vacuum_insert_threshold (integer)

Значение параметра autovacuum_vacuum_insert_threshold для каждой таблицы. Специальное значение -1 может быть использовано для отключения очистки после вставки в таблицу.

autovacuum_vacuum_insert_scale_factor, toast.autovacuum_vacuum_insert_scale_factor (floating point)

Значение на уровне таблицы для параметра autovacuum_vacuum_insert_scale_factor.

autovacuum_analyze_threshold (integer)

Значение для каждой таблицы для параметра autovacuum_analyze_threshold.

autovacuum_analyze_scale_factor (floating point)

Значение на уровне таблицы для параметра autovacuum_analyze_scale_factor.

autovacuum_vacuum_cost_delay, toast.autovacuum_vacuum_cost_delay (floating point)

Значение для каждой таблицы для параметра autovacuum_vacuum_cost_delay.

autovacuum_vacuum_cost_limit, toast.autovacuum_vacuum_cost_limit (integer)

Значение для каждой таблицы для параметра autovacuum_vacuum_cost_limit.

autovacuum_freeze_min_age, toast.autovacuum_freeze_min_age (integer)

Значение для каждой таблицы для параметра vacuum_freeze_min_age. Обратите внимание, что автоочистка будет игнорировать параметры autovacuum_freeze_min_age для отдельных таблиц, которые больше, чем половина значения системного параметра autovacuum_freeze_max_age.

autovacuum_freeze_max_age, toast.autovacuum_freeze_max_age (integer)

Значение для каждой таблицы для параметра autovacuum_freeze_max_age. Обратите внимание, что автоочистка будет игнорировать параметры autovacuum_freeze_max_age для каждой таблицы, которые больше системной настройки (они могут быть только установлены меньше).

autovacuum_freeze_table_age, toast.autovacuum_freeze_table_age (integer)

Значение для каждой таблицы параметра vacuum_freeze_table_age.

autovacuum_multixact_freeze_min_age, toast.autovacuum_multixact_freeze_min_age (integer)

Значение для каждой таблицы для параметра vacuum_multixact_freeze_min_age. Обратите внимание, что автоочистка будет игнорировать параметры autovacuum_multixact_freeze_min_age для каждой таблицы, которые больше, чем половина значения системного параметра autovacuum_multixact_freeze_max_age.

autovacuum_multixact_freeze_max_age, toast.autovacuum_multixact_freeze_max_age (integer)

Значение для параметра autovacuum_multixact_freeze_max_age на уровне таблицы. Обратите внимание, что автоочистка будет игнорировать параметры autovacuum_multixact_freeze_max_age на уровне таблицы, которые больше системной настройки (они могут быть только установлены меньше).

autovacuum_multixact_freeze_table_age, toast.autovacuum_multixact_freeze_table_age (integer)

Значение для каждой таблицы параметра vacuum_multixact_freeze_table_age.

log_autovacuum_min_duration, toast.log_autovacuum_min_duration (integer)

Значение на уровне таблицы для параметра log_autovacuum_min_duration.

user_catalog_table (boolean)

Объявите таблицу как дополнительную каталожную таблицу для целей логической репликации. См. Раздел 47.6.2 для получения подробной информации. Этот параметр не может быть установлен для таблиц TOAST.

Примечания

Tantor SE автоматически создает индекс для каждого уникального ограничения и ограничения первичного ключа для обеспечения уникальности. Таким образом, нет необходимости явно создавать индекс для столбцов первичного ключа. (См. CREATE INDEX для получения дополнительной информации).

Уникальные ограничения и первичные ключи не наследуются в текущей реализации. Это делает комбинацию наследования и уникальных ограничений довольно неэффективной.

Таблица не может иметь более 1600 столбцов. (На практике эффективный предел обычно ниже из-за ограничений на длину кортежа).

Примеры

Создайте таблицу films и таблицу distributors:

CREATE TABLE films (
    code        char(5) CONSTRAINT firstkey PRIMARY KEY,
    title       varchar(40) NOT NULL,
    did         integer NOT NULL,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute
);

CREATE TABLE distributors (
     did    integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
     name   varchar(40) NOT NULL CHECK (name <> '')
);

Создайте таблицу с двумерным массивом:

CREATE TABLE array_int (
    vector  int[][]
);

Определите уникальное ограничение таблицы для таблицы films. Уникальные ограничения таблицы могут быть определены для одной или нескольких колонок таблицы:

CREATE TABLE films (
    code        char(5),
    title       varchar(40),
    did         integer,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute,
    CONSTRAINT production UNIQUE(date_prod)
);

Определение ограничения столбца проверки:

CREATE TABLE distributors (
    did     integer CHECK (did > 100),
    name    varchar(40)
);

Определение ограничения таблицы проверки:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40),
    CONSTRAINT con1 CHECK (did > 100 AND name <> '')
);

Определите ограничение первичного ключа для таблицы films:

CREATE TABLE films (
    code        char(5),
    title       varchar(40),
    did         integer,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute,
    CONSTRAINT code_title PRIMARY KEY(code,title)
);

Определите ограничение первичного ключа для таблицы distributors. Следующие два примера эквивалентны, первый использует синтаксис ограничения таблицы, второй - синтаксис ограничения столбца:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40),
    PRIMARY KEY(did)
);

CREATE TABLE distributors (
    did     integer PRIMARY KEY,
    name    varchar(40)
);

Назначьте литеральное константное значение по умолчанию для столбца name, устройте так, чтобы значение по умолчанию для столбца did генерировалось путем выбора следующего значения объекта последовательности, и сделайте значение по умолчанию для modtime временем вставки строки:

CREATE TABLE distributors (
    name      varchar(40) DEFAULT 'Luso Films',
    did       integer DEFAULT nextval('distributors_serial'),
    modtime   timestamp DEFAULT current_timestamp
);

Определите два ограничения столбца NOT NULL на таблице distributors, одно из которых явно имеет имя:

CREATE TABLE distributors (
    did     integer CONSTRAINT no_null NOT NULL,
    name    varchar(40) NOT NULL
);

Определите уникальное ограничение для столбца name:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40) UNIQUE
);

То же самое, указанное в качестве ограничения таблицы:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40),
    UNIQUE(name)
);

Создайте такую же таблицу, указав заполнение на 70% как для самой таблицы, так и для ее уникального индекса:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40),
    UNIQUE(name) WITH (fillfactor=70)
)
WITH (fillfactor=70);

Создайте таблицу circles с ограничением исключения, которое предотвращает перекрытие двух окружностей:

CREATE TABLE circles (
    c circle,
    EXCLUDE USING gist (c WITH &&)
);

Создать таблицу cinemas в табличном пространстве diskvol1:

CREATE TABLE cinemas (
        id serial,
        name text,
        location text
) TABLESPACE diskvol1;

Создание составного типа и типизированной таблицы:

CREATE TYPE employee_type AS (name text, salary numeric);

CREATE TABLE employees OF employee_type (
    PRIMARY KEY (name),
    salary WITH OPTIONS DEFAULT 1000
);

Создание таблицы с разделением по диапазону:

CREATE TABLE measurement (
    logdate         date not null,
    peaktemp        int,
    unitsales       int
) PARTITION BY RANGE (logdate);

Создайте таблицу с разделением диапазона по нескольким столбцам в ключе разделения:

CREATE TABLE measurement_year_month (
    logdate         date not null,
    peaktemp        int,
    unitsales       int
) PARTITION BY RANGE (EXTRACT(YEAR FROM logdate), EXTRACT(MONTH FROM logdate));

Создание таблицы с разделением на список:

CREATE TABLE cities (
    city_id      bigserial not null,
    name         text not null,
    population   bigint
) PARTITION BY LIST (left(lower(name), 1));

Создание таблицы с хеш-разделением:

CREATE TABLE orders (
    order_id     bigint not null,
    cust_id      bigint not null,
    status       text
) PARTITION BY HASH (order_id);

Создание раздела для таблицы с диапазонным разделением:

CREATE TABLE measurement_y2016m07
    PARTITION OF measurement (
    unitsales DEFAULT 0
) FOR VALUES FROM ('2016-07-01') TO ('2016-08-01');

Создайте несколько секций таблицы с разделением по диапазону с несколькими столбцами в ключе раздела:

CREATE TABLE measurement_ym_older
    PARTITION OF measurement_year_month
    FOR VALUES FROM (MINVALUE, MINVALUE) TO (2016, 11);

CREATE TABLE measurement_ym_y2016m11
    PARTITION OF measurement_year_month
    FOR VALUES FROM (2016, 11) TO (2016, 12);

CREATE TABLE measurement_ym_y2016m12
    PARTITION OF measurement_year_month
    FOR VALUES FROM (2016, 12) TO (2017, 01);

CREATE TABLE measurement_ym_y2017m01
    PARTITION OF measurement_year_month
    FOR VALUES FROM (2017, 01) TO (2017, 02);

Создание раздела для таблицы с разделением по списку:

CREATE TABLE cities_ab
    PARTITION OF cities (
    CONSTRAINT city_id_nonzero CHECK (city_id != 0)
) FOR VALUES IN ('a', 'b');

Создайте секцию списка таблицы, которая сама является разделенной на подсекции, а затем добавьте к ней секцию:

CREATE TABLE cities_ab
    PARTITION OF cities (
    CONSTRAINT city_id_nonzero CHECK (city_id != 0)
) FOR VALUES IN ('a', 'b') PARTITION BY RANGE (population);

CREATE TABLE cities_ab_10000_to_100000
    PARTITION OF cities_ab FOR VALUES FROM (10000) TO (100000);

Создание секций для таблицы с хеш-разделением:

CREATE TABLE orders_p1 PARTITION OF orders
    FOR VALUES WITH (MODULUS 4, REMAINDER 0);
CREATE TABLE orders_p2 PARTITION OF orders
    FOR VALUES WITH (MODULUS 4, REMAINDER 1);
CREATE TABLE orders_p3 PARTITION OF orders
    FOR VALUES WITH (MODULUS 4, REMAINDER 2);
CREATE TABLE orders_p4 PARTITION OF orders
    FOR VALUES WITH (MODULUS 4, REMAINDER 3);

Создание раздела по умолчанию:

CREATE TABLE cities_partdef
    PARTITION OF cities DEFAULT;

Совместимость

Команда CREATE TABLE соответствует стандарту SQL, с нижеперечисленными исключениями.

Временные таблицы

Хотя синтаксис CREATE TEMPORARY TABLE похож на синтаксис стандарта SQL, эффект от него отличается. В стандарте временные таблицы определяются только один раз и автоматически существуют (начиная с пустого содержимого) в каждой сессии, которой они нужны. Вместо этого Tantor SE требует, чтобы каждая сессия выполняла свою собственную команду CREATE TEMPORARY TABLE для каждой временной таблицы, которая будет использоваться. Это позволяет разным сессиям использовать одно и то же имя временной таблицы для разных целей, в то время как подход стандарта ограничивает все экземпляры данной временной таблицы одной и той же структурой таблицы.

Определение стандарта о поведении временных таблиц широко игнорируется. Поведение Tantor SE по этому вопросу аналогично поведению нескольких других SQL-баз данных.

Стандарт SQL также различает глобальные и локальные временные таблицы, где локальная временная таблица имеет отдельный набор содержимого для каждого модуля SQL в каждой сессии, хотя ее определение все равно общее для всех сессий. Поскольку Tantor SE не поддерживает модули SQL, это различие не имеет значения в Tantor SE.

В целях совместимости Tantor SE принимает ключевые слова GLOBAL и LOCAL в объявлении временной таблицы, но они в настоящее время не имеют никакого эффекта. Использование этих ключевых слов не рекомендуется, так как будущие версии Tantor SE могут принять более стандартное толкование их значения.

Предложение ON COMMIT для временных таблиц также напоминает стандарт SQL, но имеет некоторые отличия. Если предложение ON COMMIT не указана, SQL указывает, что поведение по умолчанию - ON COMMIT DELETE ROWS. Однако, поведение по умолчанию в Tantor SE - ON COMMIT PRESERVE ROWS. Опция ON COMMIT DROP не существует в SQL.

Непрерывные ограничения уникальности

Когда ограничение UNIQUE или PRIMARY KEY не может быть отложено, Tantor SE проверяет уникальность немедленно при каждой вставке или изменении строки. Стандарт SQL говорит, что уникальность должна проверяться только в конце оператора; это имеет значение, например, когда одна команда обновляет несколько значений ключа. Чтобы получить соответствие стандарту, объявите ограничение как DEFERRABLE, но не отложенное (т.е. INITIALLY IMMEDIATE). Имейте в виду, что это может быть значительно медленнее, чем немедленная проверка уникальности.

проверочные ограничения столбцов

Стандарт SQL говорит, что ограничения столбцов CHECK могут ссылаться только на столбец, к которому они применяются; только ограничения таблицы CHECK могут ссылаться на несколько столбцов. В Tantor SE необязательно соблюдение этого ограничения; проверочные ограничения столбцов и таблиц обрабатываются одинаково.

EXCLUDE Ограничение

Тип ограничения EXCLUDE является расширением Tantor SE.

Ограничения внешнего ключа

Возможность указывать списки столбцов в действиях внешнего ключа SET DEFAULT и SET NULL является расширением Tantor SE.

Это расширение Tantor SE, которое позволяет ограничению внешнего ключа ссылаться на столбцы уникального индекса, а не на столбцы первичного ключа или уникального ограничения.

NULL Constraint

Ограничение NULL (фактически не являющееся ограничением) - это расширение Tantor SE для стандарта SQL, которое включено для обеспечения совместимости с некоторыми другими системами управления базами данных (и для симметрии с ограничением NOT NULL). Поскольку это значение по умолчанию для любого столбца, его наличие является просто шумом.

Именование ограничений

Стандарт SQL говорит, что ограничения таблицы и домена должны иметь имена, которые являются уникальными в пределах схемы, содержащей таблицу или домен. Tantor SE более гибкая: она требует только уникальности имен ограничений в пределах конкретной таблицы или домена. Однако, такая дополнительная свобода не распространяется на ограничения, основанные на индексах (UNIQUE, PRIMARY KEY и EXCLUDE), поскольку связанный с ними индекс имеет то же имя, что и ограничение, и имена индексов должны быть уникальными в пределах всех отношений в той же схеме.

В настоящее время Tantor SE не записывает имена для ограничений NOT NULL вообще, поэтому они не подвержены ограничению уникальности. Это может измениться в будущих версиях.

Наследование

Множественное наследование с помощью оператора INHERITS является расширением языка Tantor SE. Стандарт SQL:1999 и более поздние определяют одиночное наследование с использованием другого синтаксиса и другой семантики. Одиночное наследование в стиле SQL:1999 пока не поддерживается в Tantor SE.

Таблицы с нулевым количеством столбцов

Tantor SE позволяет создавать таблицу без столбцов (например, CREATE TABLE foo();). Это расширение относительно стандарта SQL, который не позволяет создавать таблицы без столбцов. Таблицы без столбцов сами по себе не очень полезны, но запрет на их создание создает странные особые случаи для ALTER TABLE DROP COLUMN, поэтому кажется более чистым игнорировать это ограничение стандарта.

Несколько столбцов идентификаторов

Tantor SE позволяет таблице иметь более одного идентификационного столбца. Стандарт определяет, что таблица может иметь не более одного идентификационного столбца. Это смягчено в основном для обеспечения большей гибкости при изменении схемы или миграции. Обратите внимание, что команда INSERT поддерживает только одно замещающее предложение, которая применяется ко всему оператору, поэтому поддержка нескольких идентификационных столбцов с разным поведением не является хорошо поддерживаемой.

Сгенерированные столбцы

Опция STORED не является стандартной, но также используется другими реализациями SQL. Стандарт SQL не определяет хранение вычисляемых столбцов.

Оператор LIKE

В то время как в стандарте SQL существует оператор LIKE, многие из опций, которые принимает Tantor SE для него, не являются стандартными, и некоторые из стандартных опций не реализованы в Tantor SE.

WITH Clause

Предложение WITH является расширением Tantor SE; параметры хранения не являются стандартными.

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

Концепция табличных пространств в Tantor SE не является частью стандарта. Поэтому, ключевые слова TABLESPACE и USING INDEX TABLESPACE являются расширениями.

Типизированные таблицы

Типизированные таблицы реализуют подмножество стандарта SQL. Согласно стандарту, типизированная таблица имеет столбцы, соответствующие основному составному типу, а также еще один столбец, который является ссылочным столбцом. Tantor SE не поддерживает явно ссылочные столбцы.

Предложение PARTITION BY

Предложение PARTITION BY является расширением Tantor SE.

Предложение PARTITION OF

Предложение PARTITION OF является расширением Tantor SE.