Привет, Я DocuDroid!
Оценка ИИ поиска
Спасибо за оценку нашего ИИ поиска!
Мы будем признательны, если вы поделитесь своими впечатлениями, чтобы мы могли улучшить наш ИИ поиск для вас и других читателей.
GitHub

CREATE TABLE

Определяет новую таблицу.

Синтаксис

CREATE [ [GLOBAL | LOCAL] {TEMPORARY | TEMP } | UNLOGGED] TABLE [IF NOT EXISTS]
  <table_name> (
  [ { <column_name> <data_type> [ COLLATE <collation> ] [<column_constraint> [ ... ] ]
[ ENCODING ( <storage_directive> [, ...] ) ]
    | <table_constraint>
    | LIKE <source_table> [ <like_option> ... ] }
    | [ <column_reference_storage_directive> [, ...] ]
    [, ... ]
] )
[ INHERITS ( <parent_table> [, ... ] ) ]
[ WITH ( <storage_parameter> [=<value>] [, ... ] ) ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE <tablespace_name> ]
[ DISTRIBUTED BY (<column> [<opclass>], [ ... ] )
       | DISTRIBUTED RANDOMLY | DISTRIBUTED REPLICATED ]

{ --partitioned table using SUBPARTITION TEMPLATE
[ PARTITION BY <partition_type> (<column>)
  {  [ SUBPARTITION BY <partition_type> (<column1>)
       SUBPARTITION TEMPLATE ( <template_spec> ) ]
          [ SUBPARTITION BY <partition_type> (<column2>)
            SUBPARTITION TEMPLATE ( <template_spec> ) ]
              [...]  }
  ( <partition_specification> ) ]
} |

{ -- partitioned table without SUBPARTITION TEMPLATE
[ PARTITION BY <partition_type> (<column>)
   [ SUBPARTITION BY <partition_type> (<column1>) ]
      [ SUBPARTITION BY <partition_type> (<column2>) ]
         [...]
  ( <partition_specification>
     [ ( <subpartition_spec_column1>
          [ ( <subpartition_spec_column2>
               [...] ) ] ) ],
  [ <partition_specification>
     [ ( <subpartition_spec_column1>
        [ ( <subpartition_spec_column2>
             [...] ) ] ) ], ]
    [...]
  ) ]
}

CREATE [ [GLOBAL | LOCAL] {TEMPORARY | TEMP} | UNLOGGED ] TABLE [IF NOT EXISTS]
   <table_name>
    OF <type_name> [ (
  { <column_name> WITH OPTIONS [ <column_constraint> [ ... ] ]
    | <table_constraint> }
    [, ... ]
) ]
[ WITH ( <storage_parameter> [=<value>] [, ... ] ) ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE <tablespace_name> ]
[ DISTRIBUTED BY (<column> [<opclass>], [ ... ] )
       | DISTRIBUTED RANDOMLY | DISTRIBUTED REPLICATED ]

где column_constraint может иметь следующие значения:

[ CONSTRAINT <constraint_name>]
{ NOT NULL
  | NULL
  | CHECK  ( <expression> ) [ NO INHERIT ]
  | DEFAULT <default_expr>
  | UNIQUE <index_parameters>
  | PRIMARY KEY <index_parameters>
  | REFERENCES <reftable> [ ( <refcolumn> ) ]
      [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
      [ ON DELETE <key_action> ] [ ON UPDATE <key_action> ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

и table_constraint может иметь следующие значения:

[ CONSTRAINT <constraint_name> ]
{ CHECK ( <expression> ) [ NO INHERIT ]
  | UNIQUE ( <column_name> [, ... ] ) <index_parameters>
  | PRIMARY KEY ( <column_name> [, ... ] ) <index_parameters>
  | FOREIGN KEY ( <column_name> [, ... ] )
      REFERENCES <reftable> [ ( <refcolumn> [, ... ] ) ]
      [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
      [ ON DELETE <key_action> ] [ ON UPDATE <key_action> ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

и like_option может иметь следующие значения:

{INCLUDING|EXCLUDING} {DEFAULTS|CONSTRAINTS|INDEXES|STORAGE|COMMENTS|ALL}

и index_parameters в ограничениях UNIQUE и PRIMARY KEY:

[ WITH ( <storage_parameter> [=<value>] [, ... ] ) ]
[ USING INDEX TABLESPACE <tablespace_name> ]

и storage_directive для столбца может иметь следующие значения:

   compresstype={ZLIB|ZSTD|RLE_TYPE|NONE}
    [compresslevel={1-19}]
    [blocksize={8192-2097152} ]

и storage_parameter для таблицы может иметь следующие значения:

   appendoptimized={TRUE|FALSE}
   blocksize={8192-2097152}
   orientation={COLUMN|ROW}
   checksum={TRUE|FALSE}
   compresstype={ZLIB|ZSTD|RLE_TYPE|NONE}
   compresslevel={1-19}
   fillfactor={10-100}
   analyze_hll_non_part_table={TRUE|FALSE}
   [oids=FALSE]

и partition_type может иметь следующие значения:

    LIST | RANGE

и partition_specification:

<partition_element> [, ...]

и partition_element может иметь следующие значения:

   DEFAULT PARTITION <name>
  | [PARTITION <name>] VALUES (<list_value> [,...] )
  | [PARTITION <name>]
     START ([<datatype>] '<start_value>') [INCLUSIVE | EXCLUSIVE]
     [ END ([<datatype>] '<end_value>') [INCLUSIVE | EXCLUSIVE] ]
     [ EVERY ([<datatype>] [<number> | INTERVAL] '<interval_value>') ]
  | [PARTITION <name>]
     END ([<datatype>] '<end_value>') [INCLUSIVE | EXCLUSIVE]
     [ EVERY ([<datatype>] [<number> | INTERVAL] '<interval_value>') ]
[ WITH ( <partition_storage_parameter>=<value> [, ... ] ) ]
[ <column_reference_storage_directive> [, ...] ]
[ TABLESPACE <tablespace> ]

где subpartition_spec или template_spec:

<subpartition_element> [, ...]

и subpartition_element может иметь следующие значения:

   DEFAULT SUBPARTITION <name>
  | [SUBPARTITION <name>] VALUES (<list_value> [,...] )
  | [SUBPARTITION <name>]
     START ([<datatype>] '<start_value>') [INCLUSIVE | EXCLUSIVE]
     [ END ([<datatype>] '<end_value>') [INCLUSIVE | EXCLUSIVE] ]
     [ EVERY ([<datatype>] [<number> | INTERVAL] '<interval_value>') ]
  | [SUBPARTITION <name>]
     END ([<datatype>] '<end_value>') [INCLUSIVE | EXCLUSIVE]
     [ EVERY ([<datatype>] [<number> | INTERVAL] '<interval_value>') ]
[ WITH ( <partition_storage_parameter>=<value> [, ... ] ) ]
[ <column_reference_storage_directive> [, ...] ]
[ TABLESPACE <tablespace> ]

где storage_parameter для партиции (partition):

   appendoptimized={TRUE|FALSE}
   blocksize={8192-2097152}
   orientation={COLUMN|ROW}
   checksum={TRUE|FALSE}
   compresstype={ZLIB|ZSTD|RLE_TYPE|NONE}
   compresslevel={1-19}
   fillfactor={10-100}
   [oids=FALSE]

Описание

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

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

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

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

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

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

Ограничения можно указать двумя способами: в виде ограничений таблицы и в виде ограничений столбца. Ограничение столбца задается как часть определения столбца. Ограничение таблицы не привязано к конкретному столбцу и может охватывать более одного столбца. Любое ограничение столбца также можно записать как ограничение таблицы; ограничение столбца — это лишь обозначение "для удобства", когда ограничение затрагивает только один столбец.

При создании таблицы в Greengage DB используется дополнительное выражение для объявления политики распределения данных. Если выражение DISTRIBUTED BY, DISTRIBUTED RANDOMLY или DISTRIBUTED REPLICATED не указано, Greengage DB назначает таблице политику хеш-распределения, используя либо PRIMARY KEY (если он есть), либо первый столбец таблицы в качестве ключа распределения. Столбцы геометрических или пользовательских (user-defined) типов данных не могут быть ключевыми столбцами распределения Greengage DB. Если в таблице нет столбца подходящего типа, строки распределяются циклическим перебором (round-robin) или случайным образом. Чтобы обеспечить равномерное распределение данных в системе Greengage DB, выбирайте ключ распределения, который уникален для каждой записи, или, если это невозможно, используйте DISTRIBUTED RANDOMLY.

Если указано выражение DISTRIBUTED REPLICATED, Greengage DB распределяет все строки таблицы на все сегменты в системе Greengage DB. Эта опция полезна в случаях, когда пользовательские функции должны выполняться на сегментах и этим функциям требуется доступ ко всем строкам таблицы. Реплицируемые таблицы также могут улучшить производительность запросов, предотвращая broadcast-перемещения (broadcast motion) для этой таблицы. Выражение DISTRIBUTED REPLICATED не может использоваться вместе с выражениями PARTITION BY или INHERITS. Реплицируемая таблица также не может быть родительской для наследования другой таблицей. Скрытые системные столбцы (ctid, cmin, cmax, xmin, xmax и gp_segment_id) нельзя использовать в пользовательских запросах к реплицируемым таблицам, поскольку они не имеют единственного однозначного значения. Greengage DB возвращает для такого запроса ошибку column does not exist. Более подробная информация о распределении данных приводится в разделе Распределение данных.

Выражение PARTITION BY позволяет разделить таблицу на несколько подтаблиц (или частей), которые вместе составляют родительскую таблицу и имеют общую схему. Хотя подтаблицы существуют как независимые таблицы, Greengage DB существенно ограничивает их использование. Внутри партиционирование реализовано как особая форма наследования. Каждая дочерняя таблица-партиция создается с отдельным ограничением-проверкой (CHECK), которое ограничивает данные, допустимые в таблице, по некоторому определяющему критерию. Ограничения CHECK также используются оптимизатором запросов для определения того, какие партиции таблицы нужно сканировать, чтобы удовлетворить заданному предикату запроса. Данные ограничения партиций управляются автоматически системой Greengage DB. Более подробная информация о партиционировании приводится в разделе Партиционирование.

Параметры

Параметр Описание

GLOBAL | LOCAL

Данные ключевые слова присутствуют для совместимости со стандартом SQL, но не оказывают влияния в Greengage DB и устарели

TEMPORARY | TEMP

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

UNLOGGED

Если указано, таблица создается как нежурналируемая (unlogged). Данные, записываемые в unlogged-таблицы, не записываются в журнал предзаписи (WAL), что делает такие таблицы значительно быстрее обычных. Однако содержимое unlogged-таблицы не реплицируется на зеркальные (mirror) экземпляры сегментов. Кроме того, unlogged-таблица не обеспечивает устойчивость к аварийному завершению. После падения сегмента или некорректного завершения работы данные unlogged-таблицы на этом сегменте усекаются (truncated). Любые индексы, созданные на unlogged-таблице, автоматически становятся unlogged

table_name

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

OF <type_name>

Создает типизированную таблицу (typed table), структура которой берется из указанного составного типа (имя типа — опционально с указанием схемы). Типизированная таблица связана со своим типом; например, таблица будет удалена, если удалить тип (через DROP TYPE …​ CASCADE).

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

column_name

Имя столбца, создаваемого в новой таблице

data_type

Тип данных столбца. Может включать спецификаторы массивов.

Для столбцов, содержащих текстовые данные, указывайте тип VARCHAR или TEXT. Указывать тип CHAR не рекомендуется. В Greengage DB типы VARCHAR или TEXT считают добавленное выравнивание (пробелы после последнего непробельного символа) значимыми символами, а тип CHAR — нет. См. Примечания

COLLATE <collation>

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

ПРИМЕЧАНИЕ

GPORCA поддерживает правило сортировки, только когда все столбцы в запросе используют одно и то же правило сортировки. Если столбцы в запросе используют разные правила сортировки, Greengage DB использует планировщик Postgres.

DEFAULT <default_expr>

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

ENCODING ( <storage_directive> [, …​] )

Для столбца необязательное выражение ENCODING задает тип сжатия и размер блока для данных столбца. См. WITH ( <storage_parameter>=<value> ) (ниже) для значений compresstype, compresslevel и blocksize.

Выражение допустимо только для append-optimized таблиц с колоночной ориентацией.

Настройки сжатия столбцов наследуются от уровня таблицы к уровню партиции (partition) и к уровню подпартиции (subpartition). Настройки на самом нижнем уровне имеют приоритет

INHERITS ( <parent_table> [, …] )

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

В Greengage DB выражение INHERITS не используется при создании партиционированных таблиц. Хотя концепция наследования используется в иерархиях партиций, структура наследования партиционированной таблицы создается с помощью выражения PARTITION BY.

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

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

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

LIKE <source_table> [ <like_option> …​ ]

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

ПРИМЕЧАНИЕ

Свойства хранения, такие как append-optimized или структура партиционирования, не копируются.

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

Ограничения not-null всегда копируются в новую таблицу. Ограничения CHECK копируются, только если указано INCLUDING CONSTRAINTS. Различие между ограничениями столбца и ограничениями таблицы не проводится.

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

Любые индексы исходной таблицы не будут созданы в новой таблице, если только не указано выражение INCLUDING INDEXES.

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

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

INCLUDING ALL — сокращенная форма INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES INCLUDING STORAGE INCLUDING COMMENTS.

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

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

CONSTRAINT <constraint_name>

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

ПРИМЕЧАНИЕ

Имя, указанное в качестве constraint_name, используется для ограничения, а для имени индекса используется сгенерированное системой уникальное имя.

NULL | NOT NULL

Задает, разрешено или запрещено столбцу содержать значения null. По умолчанию используется NULL

CHECK (<expression>) [ NO INHERIT ]

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

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

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

UNIQUE (<column_constraint>)

UNIQUE (<column_name> [, …​]) (<table_constraint>)

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

Информацию об управлении и ограничениях для UNIQUE см. в Примечания

PRIMARY KEY (<column_constraint>)

PRIMARY KEY (<column_name> [, …​]) (<table_constraint>)

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

Чтобы таблица могла иметь первичный ключ, она должна быть хеш-распределенной (не распределенной случайно) и первичный ключ (уникальные столбцы) должен включать все столбцы ключа распределения. Кроме того, если таблица партиционирована, ключ должен включать все столбцы ключа партиционирования. Обратите внимание: ограничение ключа в партиционированной таблице — это не то же самое, что простой UNIQUE INDEX.

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

Информацию об управлении и ограничениях для первичного ключа см. в Примечания

REFERENCES <reftable> [ ( <refcolumn> ) ]

[ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]

[ON DELETE | ON UPDATE] <key_action>

FOREIGN KEY (<column_name> [, …​])

Выражения REFERENCES и FOREIGN KEY задают ограничения ссылочной целостности (ограничения внешнего ключа). Greengage DB принимает ограничения ссылочной целостности, заданные в синтаксисе PostgreSQL, но не применяет их. См. документацию PostgreSQL для сведений об ограничениях ссылочной целостности

[NOT] DEFERRABLE

Выражение [NOT] DEFERRABLE управляет тем, может ли ограничение быть отложено (deferred). Ограничение, которое нельзя откладывать, будет проверяться сразу после каждой команды. Проверку ограничений, которые можно откладывать, можно перенести до конца транзакции (с помощью команды SET CONSTRAINTS). NOT DEFERRABLE используется по умолчанию. В настоящее время откладываемыми могут быть только ограничения UNIQUE и PRIMARY KEY. Ограничения NOT NULL и CHECK не могут быть откладываемыми. Ограничения REFERENCES (внешний ключ) принимают это выражение, но не применяются

INITIALLY IMMEDIATE

INITIALLY DEFERRED

Если ограничение можно откладывать, это выражение задает время проверки ограничения по умолчанию. Если ограничение INITIALLY IMMEDIATE, оно проверяется после каждого оператора. Это значение по умолчанию. Если ограничение INITIALLY DEFERRED, оно проверяется только в конце транзакции. Время проверки ограничения можно изменить командой SET CONSTRAINTS

WITH (<storage_parameter>=<value>)

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

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

Доступны следующие опции хранения:

  • appendoptimized — установите TRUE, чтобы создать таблицу как append-optimized. Если указано FALSE или ничего не указано, таблица будет создана как обычная heap-таблица.

  • blocksize — установите размер блока (в байтах) для каждого блока таблицы. blocksize должен быть в диапазоне от 8192 до 2097152 байт и кратен 8192. Значение по умолчанию — 32768. Опция blocksize действует только если указано appendoptimized=TRUE.

  • orientation — установите column для колоночной ориентации или row (по умолчанию) для строковой. Опция действует только если указано appendoptimized=TRUE. Heap-таблицы могут иметь только строковую ориентацию.

  • checksum — опция действует только для append-optimized таблиц (appendoptimized=TRUE). Значение TRUE используется по умолчанию и включает проверку контрольной суммы CRC для append-optimized таблиц. Контрольная сумма вычисляется при создании блока и хранится на диске. Проверка выполняется при чтении блока. Если контрольная сумма, вычисленная при чтении, не совпадает с сохраненной, транзакция отменяется. Если задать значение FALSE, чтобы отключить проверку контрольной суммы, проверка данных таблицы на повреждения на диске выполняться не будет.

  • compresstype — установите ZLIB (по умолчанию), ZSTD или RLE_TYPE, чтобы задать тип используемого сжатия. Значение NONE отключает сжатие. Zstd обеспечивает сочетание скорости и хорошего коэффициента сжатия и настраивается опцией compresslevel. Zlib оставлен для обратной совместимости. Zstd превосходит эти типы сжатия на типичных нагрузках. Опция compresstype действует только если appendoptimized=TRUE.

    Значение RLE_TYPE, поддерживаемое только если указано orientation=COLUMN, включает алгоритм сжатия RLE (run-length encoding). RLE сжимает данные лучше, чем Zstd или zlib, когда одно и то же значение встречается во многих последовательных строках.

    Для столбцов типа BIGINT, INTEGER, DATE, TIME или TIMESTAMP также применяется delta-сжатие, если опция compresstype установлена в RLE_TYPE. Алгоритм delta-сжатия основан на разнице между значениями столбца в соседних строках и предназначен для улучшения сжатия, когда данные загружаются в отсортированном порядке или сжатие применяется к данным столбца, упорядоченным по значению.

  • compresslevel — для сжатия Zstd в append-optimized таблицах задайте целое значение от 1 (самое быстрое сжатие) до 19 (наивысший коэффициент сжатия). Для сжатия zlib допустимый диапазон — от 1 до 9. Для RLE_TYPE уровень сжатия может быть целым значением от 1 (самое быстрое сжатие) до 4 (наивысший коэффициент сжатия).

    Опция compresslevel действует только если указано appendoptimized=TRUE.

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

    Опция fillfactor действует только для heap-таблиц (appendoptimized=FALSE).

  • analyze_hll_non_part_table — установите этот параметр хранения в true, чтобы принудительно собирать HLL-статистику, даже если таблица не является частью партиционированной таблицы. Это полезно, если таблица будет обменяна (exchange) или добавлена в партиционированную таблицу, чтобы таблицу не пришлось анализировать повторно. Значение по умолчанию — false.

  • oids=FALSE — это значение по умолчанию; оно гарантирует, что строкам не будут назначаться object identifier (OID). Greengage DB не поддерживает WITH OIDS или oids=TRUE для добавления системного столбца OID. На больших таблицах, типичных для Greengage DB, использование OID для строк таблицы может привести к переполнению (wrap-around) 32-битного счетчика OID. После переполнения OID нельзя считать уникальными, что не только делает их бесполезными для пользовательских приложений, но и может создать проблемы в системных таблицах каталогов Greengage DB.

ON COMMIT

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

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

  • DELETE ROWS — все строки во временной таблице будут удалены в конце каждого блока транзакции. По сути, при каждом commit выполняется автоматический TRUNCATE.

  • DROP — временная таблица будет удалена в конце текущего блока транзакции.

TABLESPACE <tablespace>

Имя табличного пространства (tablespace), в котором должна быть создана новая таблица

USING INDEX TABLESPACE <tablespace>

Позволяет выбрать табличное пространство, в котором будет создан индекс, связанный с ограничением UNIQUE или PRIMARY KEY

DISTRIBUTED BY (<column> [<opclass>], [ …​ ])

DISTRIBUTED RANDOMLY

DISTRIBUTED REPLICATED

Объявляет политику распределения Greengage DB для таблицы. DISTRIBUTED BY использует хеш-распределение с одним или несколькими столбцами в качестве ключа распределения. Для наиболее равномерного распределения данных ключ распределения должен быть первичным ключом таблицы или уникальным столбцом (или набором столбцов). Если это невозможно, можно выбрать DISTRIBUTED RANDOMLY, который распределяет данные round-robin по экземплярам сегментов. Кроме того, можно указать класс операторов opclass, чтобы использовать не-default хеш-функцию.

Параметр конфигурации сервера Greengage DB gp_create_table_random_default_distribution управляет политикой распределения по умолчанию, если при создании таблицы не указано выражение DISTRIBUTED BY. Greengage DB следует таким правилам, если политика распределения не указана.

Если значение параметра off (по умолчанию), Greengage DB выбирает ключ распределения таблицы на основе команды:

  • Если указано выражение LIKE или INHERITS, Greengage DB копирует ключ распределения из исходной или родительской таблицы.

  • Если указаны ограничения PRIMARY KEY или UNIQUE, Greengage DB выбирает наибольшее подмножество всех столбцов ключа в качестве ключа распределения.

  • Если не указаны ни ограничения, ни выражения LIKE или INHERITS, Greengage DB выбирает первый подходящий столбец как ключ распределения. Столбцы геометрических или пользовательских типов данных не могут быть ключевыми столбцами распределения Greengage DB.

Если значение параметра on, Greengage DB следует таким правилам:

  • Если столбцы PRIMARY KEY или UNIQUE не указаны, распределение таблицы случайное (DISTRIBUTED RANDOMLY). Распределение будет случайным даже если команда создания таблицы содержит выражение LIKE или INHERITS.

  • Если столбцы PRIMARY KEY или UNIQUE указаны, то также должно быть указано выражение DISTRIBUTED BY. Если выражение DISTRIBUTED BY не указано в команде создания таблицы, команда завершится ошибкой.

Выражение DISTRIBUTED REPLICATED означает репликацию всей таблицы на все экземпляры сегментов Greengage DB. Это можно использовать, когда необходимо выполнять пользовательские функции на сегментах и функциям требуется доступ ко всем строкам таблицы, либо чтобы улучшить производительность запросов, предотвращая broadcast motion

PARTITION BY

Объявляет один или несколько столбцов, по которым требуется партиционировать таблицу.

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

ПРИМЕЧАНИЕ

Greengage DB хранит данные партиционированной таблицы в листовых дочерних таблицах (leaf), то есть в таблицах самого нижнего уровня иерархии, используемой партиционированной таблицей.

partition_type

Объявляет тип партиционирования: LIST (список значений) или RANGE (на основе диапазона: числового или дат)

partition_specification

Объявляет отдельные партиции, которые нужно создать. Каждую партицию можно определить индивидуально, либо (для партиций на основе диапазонов) можно использовать выражение EVERY (вместе с START и опционально END), чтобы определить шаблон шага (increment pattern), по которому будут создаваться партиции. Определение партиции может включать в себя следующие выражения:

  • DEFAULT PARTITION <name> — объявляет партицию по умолчанию. Если данные не соответствуют ни одной существующей партиции, они вставляются в партицию по умолчанию. Схемы партиционирования без партиции по умолчанию будут отклонять входящие строки, которые не соответствуют существующим партициям.

  • PARTITION <name> — объявляет имя партиции. Партиции создаются по следующему соглашению именования: parentname_level#_prt_givenname.

  • VALUES — для list-партиций задает значения, которые будет содержать партиция.

  • START — для партиций на основе диапазонов задает начальное значение диапазона партиции. По умолчанию начальные значения включены в диапазон (INCLUSIVE). Например, если вы указали дату начала '2016-01-01', партиция будет содержать все даты больше либо равные '2016-01-01'. Обычно тип данных выражения START совпадает с типом столбца ключа партиционирования. Если это не так, необходимо явно привести (cast) к целевому типу данных.

  • END — для партиций на основе диапазонов задает конечное значение диапазона партиции. По умолчанию конечные значения не включены в диапазон (EXCLUSIVE). Например, если вы указали дату окончания '2016-02-01', партиция будет содержать все даты меньше, но не равные '2016-02-01'. Обычно тип данных выражения END совпадает с типом столбца ключа партиционирования. Если это не так, требуется явно привести его к нужному типу данных.

  • EVERY — для партиций на основе диапазона (range-партиций) задает, как увеличивать значения от START до END, чтобы создавать отдельные партиции. Обычно тип данных выражения EVERY совпадает с типом столбца ключа партиционирования. Если это не так, требуется явно привести его к нужному типу данных.

  • WITH — задает опции хранения таблицы для партиции. Например, вы можете захотеть, чтобы старые партиции были append-optimized таблицами, а новые партиции — обычными heap-таблицами.

  • TABLESPACE — имя табличного пространства, в котором должна быть создана партиция.

SUBPARTITION BY

Объявляет один или несколько столбцов, по которым требуется под-партиционировать партиции первого уровня таблицы

SUBPARTITION TEMPLATE

Объявляет шаблон подпартиций, который будет использоваться для создания подпартиций для всех родительских партиций

Примечания

  • В Greengage DB (основанном на PostgreSQL) типы данных VARCHAR или TEXT считают добавленное выравнивание в текстовых данных (пробелы после последнего непробельного символа) значимыми символами; тип CHAR — нет.

    В Greengage DB значения типа CHAR(n) дополняются пробелами справа до заданной ширины n. Значения хранятся и отображаются вместе с пробелами. Однако дополняющие пробелы считаются семантически незначимыми. При распределении значений конечные пробелы игнорируются. Конечные пробелы также считаются семантически незначимыми при сравнении двух значений типа CHAR, и они удаляются при преобразовании значения типа CHAR в один из других строковых типов.

  • Greengage DB не поддерживает WITH OIDS или oids=TRUE для назначения системного столбца OID. Использовать OID в новых приложениях не рекомендуется. Этот синтаксис устарел. В качестве альтернативы используйте SERIAL или другой генератор последовательности в качестве первичного ключа таблицы. Однако если ваше приложение использует OID для идентификации конкретных строк таблицы, рекомендуется создать уникальное ограничение на столбец OID этой таблицы, чтобы гарантировать, что OID в таблице действительно будут однозначно идентифицировать строки даже после переполнения счетчика. Не следует предполагать, что OID уникальны между таблицами; если нужен уникальный идентификатор на уровне базы данных, используйте комбинацию OID таблицы и OID строки.

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

    Реплицируемые таблицы (DISTRIBUTED REPLICATED) могут иметь ограничения столбцов PRIMARY KEY и UNIQUE.

    Ограничение первичного ключа — это просто комбинация ограничения уникальности и ограничения not-null.

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

    Ограничения внешнего ключа не поддерживаются в Greengage DB.

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

  • Для append-optimized таблиц операции UPDATE и DELETE не допускаются в транзакции уровня repeatable read или serializable и приводят к преждевременному завершению транзакции. DECLARE …​ FOR UPDATE и триггеры не поддерживаются для append-optimized таблиц. CLUSTER для append-optimized таблиц поддерживается только по B-tree индексам.

  • Чтобы вставить данные в партиционированную таблицу, вы указываете корневую партиционированную таблицу — таблицу, созданную командой CREATE TABLE. Также можно указать листовую дочернюю таблицу партиционированной таблицы в команде INSERT. Если данные недопустимы для указанной листовой дочерней таблицы, возвращается ошибка. Указывать дочернюю таблицу, которая не является листовой, в команде INSERT не допускается. Выполнение других DML-команд, таких как UPDATE и DELETE, для любой дочерней таблицы партиционированной таблицы не поддерживается. Эти команды должны выполняться на корневой партиционированной таблице — таблице, созданной командой CREATE TABLE.

  • Значения по умолчанию для этих опций хранения таблиц можно задать параметром конфигурации сервера gp_default_storage_options. Список включает appendoptimized, blocksize, checksum, compresstype, compresslevel и orientation. Значения по умолчанию можно задавать на уровне системы, базы данных или пользователя.

ВАЖНО

Текущий планировщик Postgres допускает list-партиции с многоколоночными (composite) ключами партиционирования. GPORCA не поддерживает составные ключи, поэтому использовать составные ключи партиционирования не рекомендуется.

Примеры

Создать таблицу с именем rank в схеме baby и распределить данные по столбцам rank, gender и year:

CREATE TABLE baby.rank
(
    id     int,
    rank   int,
    year   smallint,
    gender char(1),
    count  int
)
    DISTRIBUTED BY (rank, gender, year);

Создать таблицу 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 DEFAULT nextval('serial'),
    name varchar(40) NOT NULL CHECK (name <> '')
);

Создать append-optimized таблицу, сжатую с помощью gzip:

CREATE TABLE sales
(
    txn_id int,
    qty    int,
    date   date
)
    WITH (appendoptimized = true, compresslevel = 5)
    DISTRIBUTED BY (txn_id);

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

CREATE TABLE sales
(
    id     int,
    year   int,
    qtr    int,
    c_rank int,
    code   char(1),
    region text
)
    DISTRIBUTED BY (id)
    PARTITION BY LIST (code)
        ( PARTITION sales VALUES ('S'),
        PARTITION returns VALUES ('R')
        );

Создать трехуровневую партиционированную таблицу, которая определяет подпартиции без партиции SUBPARTITION TEMPLATE:

CREATE TABLE sales
(
    id     int,
    year   int,
    qtr    int,
    c_rank int,
    code   char(1),
    region text
)
    DISTRIBUTED BY (id)
    PARTITION BY LIST (code)
    SUBPARTITION BY RANGE (c_rank)
    SUBPARTITION BY LIST (region)
    (
        PARTITION sales VALUES ('S')
        (
            SUBPARTITION cr1 START (1) END (2)
            (
                SUBPARTITION ca VALUES ('CA')
            ),
            SUBPARTITION cr2 START (3) END (4)
            (
                SUBPARTITION ca VALUES ('CA')
            )
        ),

        PARTITION returns VALUES ('R')
        (
            SUBPARTITION cr1 START (1) END (2)
            (
                SUBPARTITION ca VALUES ('CA')
            ),
            SUBPARTITION cr2 START (3) END (4)
            (
                SUBPARTITION ca VALUES ('CA')
            )
        )
);

Создать ту же партиционированную таблицу, что и в предыдущем примере, используя партицию SUBPARTITION TEMPLATE:

CREATE TABLE sales1
(
    id     int,
    year   int,
    qtr    int,
    c_rank int,
    code   char(1),
    region text
)
    DISTRIBUTED BY (id)
    PARTITION BY LIST (code)
        SUBPARTITION BY RANGE (c_rank)
            SUBPARTITION TEMPLATE (
            SUBPARTITION cr1 START (1) END (2),
            SUBPARTITION cr2 START (3) END (4) )
        SUBPARTITION BY LIST (region)
            SUBPARTITION TEMPLATE (
            SUBPARTITION ca VALUES ('CA') )

        ( PARTITION sales VALUES ('S'),
        PARTITION returns VALUES ('R')
        );

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

CREATE TABLE sales
(
    id     int,
    year   int,
    qtr    int,
    c_rank int,
    code   char(1),
    region text
)
    DISTRIBUTED BY (id)
    PARTITION BY RANGE (year)
        SUBPARTITION BY RANGE (qtr)
            SUBPARTITION TEMPLATE (
            START (1) END (5) EVERY (1),
            DEFAULT SUBPARTITION bad_qtr )
        SUBPARTITION BY LIST (region)
            SUBPARTITION TEMPLATE (
            SUBPARTITION usa VALUES ('usa'),
            SUBPARTITION europe VALUES ('europe'),
            SUBPARTITION asia VALUES ('asia'),
            DEFAULT SUBPARTITION other_regions)

        ( START (2009) END (2011) EVERY (1),
        DEFAULT PARTITION outlying_years);

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

Команда CREATE TABLE соответствует стандарту SQL за следующими исключениями:

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

    Различие стандарта между глобальными и локальными временными таблицами отсутствует в Greengage DB. Greengage DB принимает ключевые слова GLOBAL и LOCAL в объявлении временной таблицы, но они не оказывают влияния и устарели.

    Если выражение ON COMMIT не указано, стандарт SQL задает поведение по умолчанию как ON COMMIT DELETE ROWS. Однако поведение по умолчанию в Greengage DB — ON COMMIT PRESERVE ROWS. Опция ON COMMIT DROP отсутствует в стандарте SQL.

  • Ограничения-проверки столбцов — стандарт SQL говорит, что ограничения столбца CHECK могут ссылаться только на тот столбец, к которому они применяются; только ограничения таблицы CHECK могут ссылаться на несколько столбцов. Greengage DB не применяет это ограничение; система рассматривает проверки CHECK столбца и таблицы одинаково.

  • Ограничение NULL — это расширение Greengage DB к стандарту SQL, включенное для совместимости с некоторыми другими СУБД (и для симметрии с ограничением NOT NULL). Поскольку это значение по умолчанию для любого столбца, его наличие не требуется.

  • Наследование — множественное наследование через выражение INHERITS — это языковое расширение Greengage DB. Стандарт SQL:1999 и более поздние версии определяют одиночное наследование с использованием другого синтаксиса и другой семантики. Наследование в стиле SQL:1999 пока не поддерживается Greengage DB.

  • Партиционирование — партиционирование таблиц через выражение PARTITION BY — это языковое расширение Greengage DB.

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

  • LIKE — хотя выражения LIKE существует в стандарте SQL, многие опции, которые принимает Greengage DB, отсутствуют в стандарте, и некоторые стандартные опции не реализованы в Greengage DB.

  • Выражение WITH — это расширение Greengage DB; ни параметры хранения, ни OID не входят в стандарт.

  • Табличные пространства — концепция табличных пространств (tablespace) Greengage DB не является частью стандарта SQL. Выражения TABLESPACE и USING INDEX TABLESPACE — расширения.

  • Распределение данных — концепция параллельной или распределенной базы данных Greengage DB не является частью стандарта SQL. Выражения DISTRIBUTED — расширения.

См. также