CREATE TABLE#

CREATE TABLE

CREATE TABLE

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 ) } [ COLLATE collation ] [ opclass [ ( opclass_parameter = value [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]

referential_action in a FOREIGN KEY/REFERENCES constraint is:

{ NO ACTION | RESTRICT | CASCADE | SET NULL [ ( column_name [, ... ] ) ] | SET DEFAULT [ ( column_name [, ... ] ) ] }

Описание

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

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

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

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

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

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

Параметры

TEMPORARY or TEMP #

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

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

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

UNLOGGED #

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

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

IF NOT EXISTS #

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

table_name #

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

OF type_name #

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

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

column_name #

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

data_type #

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

COLLATE collation #

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

STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } #

Эта форма устанавливает режим хранения для столбца. Это контролирует, будет ли этот столбец храниться в строке или во вторичной таблице TOAST, и должны ли данные быть сжаты или нет. PLAIN должен использоваться для значений фиксированной длины, таких как integer, и хранится в строке, несжатым. MAIN предназначен для сжимаемых данных, хранящихся в строке. EXTERNAL предназначен для внешних, несжатых данных, а EXTENDED предназначен для внешних, сжатых данных. Запись DEFAULT устанавливает режим хранения по умолчанию для типа данных столбца. EXTENDED является режимом по умолчанию для большинства типов данных, которые поддерживают не-PLAIN хранение. Использование EXTERNAL ускорит операции с подстроками на очень больших значениях text и bytea, за счет увеличения занимаемого пространства. Дополнительную информацию см. в Раздел 70.2.

COMPRESSION compression_method #

Предложение COMPRESSION устанавливает метод сжатия для столбца. Сжатие поддерживается только для типов данных переменной ширины и используется только тогда, когда режим хранения столбца - main или extended. (См. ALTER TABLE для получения информации о режимах хранения столбцов). Установка этого свойства для секционированной таблицы не имеет прямого эффекта, поскольку у таких таблиц нет собственного хранилища, но настроенное значение будет наследоваться новосозданными секциями. Поддерживаемые методы сжатия - pglz и lz4. (lz4 доступен только если при построении Tantor BE использовалась опция --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 BE), но для секционирования по списку ключ разделения должен состоять из одного столбца или выражения.

Секционирование по списку и диапазону требуют класса операторов btree, в то время как секционирование по хешу требует класса операторов hash. Если класс операторов не указан явно, будет использоваться класс операторов по умолчанию соответствующего типа; если класс операторов по умолчанию не существует, будет вызвана ошибка. При использовании секционирования по хешу используемый класс операторов должен реализовывать функцию поддержки 2 (см. Раздел 35.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, чтобы указать, что секция позволяет столбцу c ключом разделения быть пустым. Однако для данной родительской таблицы не может быть более одного такого списка секций. 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 указывает таблицу, из которой новая таблица автоматически копирует все имена столбцов, их типы данных и ограничения 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 настройки для скопированных определений столбцов будут скопированы. По умолчанию исключаются STORAGE настройки, что приводит к тому, что скопированные столбцы в новой таблице имеют типовые настройки по умолчанию. Дополнительную информацию о STORAGE настройках см. в разделе Раздел 70.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 ) ] #

Этот клауз создает столбец как столбец идентичности. К нему будет прикреплена неявная последовательность, и в новых вставленных строках столбец автоматически будет иметь значения, назначенные из последовательности. Такой столбец неявно 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, плюс SEQUENCE NAME name, LOGGED и UNLOGGED, которые позволяют выбрать имя и уровень устойчивости последовательности. Без SEQUENCE NAME система выбирает неиспользованное имя для последовательности. Без LOGGED или UNLOGGED, последовательность будет иметь тот же уровень устойчивости, что и таблица.

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 (см. Глава 61); на данный момент это означает, что 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. См. Глава 60 для получения дополнительной информации. Если этот параметр не указан, для новой таблицы выбирается метод доступа по умолчанию. См. 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 таблицы, если таковая имеется (см. раздел Раздел 70.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 на этой таблице в соответствии с правилами, обсуждаемыми в разделе Раздел 23.1.6. Если значение false, то эта таблица не будет автоматически очищаться, за исключением предотвращения зацикливания идентификатора транзакции. См. раздел Раздел 23.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) #

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

Примечания

Tantor BE автоматически создает индекс для каждого ограничения уникальности и ограничения первичного ключа для обеспечения уникальности. Таким образом, нет необходимости явно создавать индекс для столбцов первичного ключа. (См. 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 BE требует, чтобы каждая сессия выполняла свою собственную команду CREATE TEMPORARY TABLE для каждой временной таблицы, которая будет использоваться. Это позволяет разным сессиям использовать одно и то же имя временной таблицы для разных целей, в то время как подход стандарта ограничивает все экземпляры данной временной таблицы одной и той же структурой таблицы.

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

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

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

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

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

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

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

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

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

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

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

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

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

NULL Constraint

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

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

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

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

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

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

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

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

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

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

Генерируемые столбцы

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

Оператор LIKE

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

WITH Clause

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

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

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

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

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

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

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

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

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