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 [, ... ] ) ]
[ USING { MARS2 | MARS3} ]
[ 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_spec ) ]
} |

{ -- partitioned table without SUBPARTITION TEMPLATE
[ PARTITION BY partition_type (column)
   [ SUBPARTITION BY partition_type (column1) ]
      [ SUBPARTITION BY partition_type (column2) ]
         [...]
  ( partition_spec
     [ ( subpartition_spec_column1
          [ ( subpartition_spec_column2
               [...] ) ] ) ],
  [ partition_spec
     [ ( 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 ]

где 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}

Параметры индекса в ограничениях UNIQUE и PRIMARY KEY:

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

storage_directive столбца:

compresstype={ZLIB|ZSTD|QUICKLZ|RLE_TYPE|NONE|MXCUSTOM}
    [compresslevel={0-9}]
    [blocksize={8192-2097152} ]
    // When compressiontype=MXCUSTOM, you need to specify the specific encodechain
    [encodechain={LZ4|ZSTD|DELTADELTA(缩放位数)|DELTAZIGZAG|GORILLA|GORILLA2|FLOATINT|FDS|AUTO}]

storage_parameter таблицы:

   appendoptimized={TRUE|FALSE}
   blocksize={8192-2097152}
   orientation={COLUMN|ROW}
   checksum={TRUE|FALSE}

   // The following are the relevant parameters of the encoding chain
   compresstype={ZLIB|ZSTD|QUICKLZ|RLE_TYPE|NONE|MXCUSTOM}
   // When compressiontype=MXCUSTOM, you need to specify the specific encodechain
   encodechain={LZ4|ZSTD|DELTADELTA(缩放位数)|DELTAZIGZAG|GORILLA|GORILLA2|FLOATINT|FDS|AUTO}
   /* When compresstype=MXCUSTOM and encodechain=AUTO, adaptive encoding mode can be specified at the table level:     
    * automode=1 means compression rate is preferred, automode=2 means speed is preferred
    */
   automode={1|2}
   compresslevel={0-9}

   fillfactor={10-100}
   [oids=FALSE]

   // The following are the parameters related to the MARS2 table
   // Used to control all MARS2 tables, how many Runs can be triggered by L0 (v4.5.0 starts to support)
   sortheap_automerge_threshold={10-2048}
   // Used to control how many Runs are reached in MARS2 single table L0 to trigger merges (v4.5.0 is supported)
   level0_merge_threshold={1-2048}
   // Control the size of the MARS2 single table L0 -> L1 upgrade. When L0 merges, the result will be upgraded to L1 if it exceeds this size.
    *(v4.5.0 is supported)
    */
   level0_upgrade_size={1-10000}
   /* Control the size of the MARS2 single table L1 -> L2 upgrade. When the result of the L1 merge exceeds this size, it will be upgraded to L2.
    *(v4.5.0 is supported)
    */
   level1_upgrade_size={1-10000}
   // Controls the sorted memory size of MARS2 forms individual inserts, and if the insert target table is a partitioned table, they will share this size (v4.5.0 starts to support)
   sortheap_sort_mem={128-2147483647}
   // Controls at least how much sorted memory is allocated for a single MARS2 partition table (v4.5.0 is supported)
   sortheap_sort_mem_core={128-2147483647}
   /* Compression threshold. Used to control how many tuples in each column of the MARS2 single table are compressed at one time.
    * It is the upper limit of the number of compressed Tuples in the same unit (v5.0.0 starts to support)
    */
   compress_threshold={1-100000}

   // The following are the parameters related to the MARS3 table (all supported starting from v5.1.0)
   /* rowstore_size is used to control when L0 Run switches in MARS3 tables. When the data size exceeds this value (in MB), it will switch to the next Run;
    * compress_threshold is same as MARS2; prefer_load_mode is used to specify the loading mode of data in MARS3. normal means normal mode,
    * The data will be stored in the disk according to the row, and then gradually converted into column storage as more data is written. bluk represents batch loading mode, and the data will be converted into column storage and then dropped into disk.
    * When the amount of data inserted in a batch exceeds rowstore_size, it will be converted into multiple columns in multiple times;
    * level_size_amplifier The enlargement coefficient used to specify the Level size
    */
   compress_threshold={1-100000},mars3options='rowstore_size={8-1024},prefer_load_mode={NORMAL|BLUK},level_size_amplifier={1-1000}'
   // The following are the parameters related to the MARS3 table downgrade storage function (all supported starting from v5.2.0)
   /* ttl_interval Used to specify the threshold for data transition from hot to cold. The unit must be specified manually, such as “2 H,” which means that data from two hours ago is defined as cold data and will be automatically downgraded;
    * ttl_interval currently supports d (days)/H (hours) units;
    * ttl_space referers to the corresponding tablespace, and cannot be created if it does not exist;
    * ttl_interval and ttl_space both need to be declared when creating tables or set with ALTER statements on existing tables.
    */
   ttl_interval={1-INT_MAX},ttl_space={}

key_action:

    ON DELETE
   | ON UPDATE
   | NO ACTION
   | RESTRICT
   | CASCADE
   | SET NULL
   | SET DEFAULT

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 ]

partition_storage_parameter секции:

   appendoptimized={TRUE|FALSE}
   blocksize={8192-2097152}
   orientation={COLUMN|ROW}
   checksum={TRUE|FALSE}

   // The following are the relevant parameters of the encoding chain
   compresstype={ZLIB|ZSTD|QUICKLZ|RLE_TYPE|NONE|MXCUSTOM}
   // When compressiontype=MXCUSTOM, you need to specify the specific encodechain
   encodechain={LZ4|ZSTD|DELTADELTA(缩放位数)|DELTAZIGZAG|GORILLA|GORILLA2|FLOATINT|FDS|AUTO}
   /* 当 compresstype=MXCUSTOM,且 encodechain=AUTO 时,支持在表级别指定自适应编码模式:     
    * automode=1 means compression rate is preferred, automode=2 means speed is preferred
    */
   automode={1|2}
   compresslevel={0-9}

   fillfactor={10-100}
   [oids=FALSE]

   // The following are the parameters related to the MARS2 table
   // Used to control all MARS2 tables, how many Runs can be triggered by L0 (v4.5.0 starts to support)
   sortheap_automerge_threshold={10-2048}
   // Used to control how many Runs are reached in MARS2 single table L0 to trigger merges (v4.5.0 is supported)
   level0_merge_threshold={1-2048}
   // Control the size of the MARS2 single table L0 -> L1 upgrade. When L0 merges, the result will be upgraded to L1 if it exceeds this size.
    *(v4.5.0 is supported)
    */
   level0_upgrade_size={1-10000}
   /* Control the size of the MARS2 single table L1 -> L2 upgrade. When the result of the L1 merge exceeds this size, it will be upgraded to L2.
    *(v4.5.0 is supported)
    */
   level1_upgrade_size={1-10000}
   // Controls the sorted memory size of MARS2 forms individual inserts, and if the insert target table is a partitioned table, they will share this size (v4.5.0 starts to support)
   sortheap_sort_mem={128-2147483647}
   // Controls at least how much sorted memory is allocated for a single MARS2 partition table (v4.5.0 is supported)
   sortheap_sort_mem_core={128-2147483647}
   /* Compression threshold. Used to control how many tuples in each column of the MARS2 single table are compressed at one time.
    * It is the upper limit of the number of compressed Tuples in the same unit (v5.0.0 starts to support)
    */
   compress_threshold={1-100000}

   // The following are the parameters related to the MARS3 table (all supported starting from v5.1.0)
   /* rowstore_size Used to control when L0 Run in the MARS3 table switches. When the data size exceeds this value (in MB), it will switch to the next Run;
    * compress_threshold is same as MARS2; prefer_load_mode is used to specify the loading mode of data in MARS3. normal means normal mode,
    * The data will be stored in the disk according to the row, and then gradually converted into column storage as more data is written. bluk represents batch loading mode, and the data will be converted into column storage and then dropped into disk.
    * When the amount of data inserted in a batch exceeds rowstore_size, it will be converted into multiple columns in multiple times;
    * level_size_amplifier The enlargement coefficient used to specify the Level size
    */
   compress_threshold={1-100000},mars3options='rowstore_size={8-1024},prefer_load_mode={NORMAL|BLUK},level_size_amplifier={1-1000}'
   // The following are the parameters related to the MARS3 table downgrade storage function (all supported starting from v5.2.0)
   /* ttl_interval Used to specify the threshold for data transition from hot to cold. The unit must be specified manually, such as “2 H,” which means that data from two hours ago is defined as cold data and will be automatically downgraded;
    * ttl_interval currently supports d (days)/H (hours) units;
    * ttl_space referers to the corresponding tablespace, and cannot be created if it does not exist;
    * ttl_interval and ttl_space both need to be declared when creating tables or set with ALTER statements on existing tables.
    */
   ttl_interval={1-INT_MAX},ttl_space={}

Примечание!
Подробную информацию о параметрах механизмов хранения MARS2 (v4.5.0 и выше) и MARS3 (v5.1.0 и выше) см. здесь.

Описание

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

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

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

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

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

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

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

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

Если указано предложение DISTRIBUTED REPLICATED, база данных YMatrix будет распределять все строки таблицы на все экземпляры Segments в системе YMatrix. Этот параметр можно использовать, когда пользовательские функции должны выполняться на Segments и требуют доступа ко всем строкам таблицы. Реплицированные таблицы также могут использоваться для предотвращения Broadcast Motions, тем самым повышая производительность запросов. Предложение DISTRIBUTED REPLICATED нельзя использовать вместе с предложением PARTITION BY или INHERITS. Реплицированная таблица не может быть унаследована другой таблицей. Скрытые системные столбцы (ctid, cmin, cmax, xmin, xmax и gp_segment_id) нельзя ссылаться в пользовательских запросах к реплицированным таблицам, поскольку они не имеют единого однозначного значения.

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

YMatrix v5.0.0 теперь поддерживает указание пользовательского алгоритма цепочки кодирования для сжатия при создании таблиц. Подробнее см. Using Compression.

Параметры

GLOBAL | LOCAL

  • Эти ключевые слова предоставляются для совместимости со стандартом SQL, но не действуют в базе данных YMatrix и считаются устаревшими.

TEMPORARY | TEMP

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

UNLOGGED

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

table_name

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

OF type_name

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

column_name

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

data_type

  • Тип данных столбца. Может включать спецификаторы массивов.
    Для столбцов таблиц, содержащих текстовые данные, рекомендуется указывать тип VARCHAR или TEXT. Не рекомендуется использовать тип CHAR. В базе данных YMatrix типы VARCHAR и TEXT корректно обрабатывают пробелы как значимые символы (пробелы после последнего непробельного символа), тогда как тип CHAR не обрабатывает такие пробелы.

COLLATE collation

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

DEFAULT default_expr

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

ENCODING ( storage_directive [, ...] )

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

INHERITS ( parent_table [, …])

  • Необязательное предложение INHERITS указывает список таблиц, от которых автоматически наследуются все столбцы. Использование INHERITS устанавливает постоянную связь между новой дочерней таблицей и её родительской таблицей. Обычно изменения схемы родителя передаются потомку, и по умолчанию данные дочерней таблицы включаются в сканирование родителя.
    В базе данных YMatrix предложение INHERITS не используется при создании партиционированных таблиц. Хотя концепция наследования применяется в иерархии партиций, структура наследования создаётся с помощью предложения PARTITION BY.
    Если более чем одна родительская таблица имеет одно и то же имя столбца, возникнет ошибка, если только типы данных этих столбцов не совпадают. При отсутствии конфликта дублирующиеся столбцы объединяются в один столбец новой таблицы. Если список столбцов новой таблицы содержит имя столбца, который также наследуется, его тип данных должен совпадать с унаследованным, и определения столбцов будут объединены. Если новая таблица явно указывает значение по умолчанию для столбца, это значение переопределяет все значения по умолчанию, указанные в объявлении наследования. В противном случае все родительские таблицы, указывающие значение по умолчанию для этого столбца, должны иметь одинаковое значение, иначе будет ошибка.
    Ограничения CHECK объединяются аналогичным образом: если несколько родительских таблиц или определение новой таблицы содержат ограничения с одинаковым именем, все выражения проверки должны совпадать, иначе будет ошибка. Ограничения с одинаковыми именами и выражениями объединяются в одну копию. Ограничения, помеченные NO INHERIT в родительской таблице, не учитываются. Обратите внимание, что безымянные ограничения CHECK в новой таблице никогда не объединяются, так как им всегда выбирается уникальное имя. Настройки STORAGE столбцов также копируются из родительской таблицы. LIKE source_table like_option ...]
  • Предложение LIKE указывает таблицу, от которой новая таблица автоматически копирует все имена столбцов, их типы данных, ограничения NOT NULL и политики распределения. Свойства хранения, такие как append optimization или структура партиций, не копируются. В отличие от INHERITS, после создания новая и исходная таблицы полностью независимы.
    Выражение по умолчанию для скопированных столбцов копируется только при указании INCLUDING DEFAULTS. По умолчанию выражения по умолчанию исключаются, и скопированные столбцы в новой таблице будут иметь пустые значения по умолчанию. Ограничения NOT NULL всегда копируются в новую таблицу. Ограничения CHECK копируются только при указании INCLUDING CONSTRAINTS. Различия между ограничениями столбцов и таблиц отсутствуют.
    Первичные ключи, уникальные ограничения и индексы создаются в новой таблице только при указании 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

  • Необязательное имя ограничения столбца или таблицы. Если ограничение нарушается, его имя появится в сообщении об ошибке, поэтому вы можете использовать имя ограничения (например, «столбец должен быть положительным»), чтобы передать клиентскому приложению полезную информацию. (Для указания имени с пробелами требуются двойные кавычки.) Если имя не указано, система генерирует его самостоятельно.
    Примечание: Указанное constraint_name используется для ограничений, но для имён индексов используется системное уникальное имя. В некоторых предыдущих версиях предоставленные имена использовались и для ограничений, и для индексов.

NULL | NOT NULL

  • Указывает, разрешены ли в столбце значения NULL. Значение по умолчанию — NULL.
    CHECK (expression) [ NO INHERIT ]
  • Предложение CHECK указывает выражение, возвращающее логическое значение. Новые или обновлённые строки должны удовлетворять этому выражению, чтобы операция вставки или обновления прошла успешно. Выражения, дающие результат TRUE или UNKNOWN, считаются успешными. Если хотя бы одна строка вставки или обновления даёт FALSE, вызывается исключение, и операция не изменяет базу данных. Ограничение CHECK, указанное как ограничение столбца, должно ссылаться только на значение этого столбца; выражение в ограничении таблицы может ссылаться на несколько столбцов.
    Ограничения, помеченные NO INHERIT, не передаются дочерним таблицам.
    В настоящее время выражение CHECK не может содержать подзапросы и не может ссылаться на переменные, кроме столбцов текущей строки.

UNIQUE ( column_constraint )
UNIQUE ( column_name [, ... ] ) ( table_constraint )

  • Ограничение UNIQUE: набор столбцов или столбцы в указанной таблице могут содержать только уникальные значения. Ограничения UNIQUE на уровне таблицы работают так же, как и на уровне столбцов, но поддерживают дополнительную функциональность для нескольких столбцов. Значения NULL не считаются равными при проверке уникальности. Уникальный столбец должен включать все столбцы ключа распределения YMatrix. Кроме того, если таблица партиционирована, ключ должен включать все столбцы ключа партиции. Обратите внимание, что ограничения ключей в партиционированной таблице отличаются от простого UNIQUE INDEX.

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

  • Ограничение PRIMARY KEY: один или несколько столбцов указанной таблицы могут содержать только уникальные (неповторяющиеся) и не-NULL значения. Только один первичный ключ может быть указан для таблицы, независимо от того, задан ли он как ограничение столбца или таблицы.
    Чтобы таблица имела первичный ключ, она должна быть хэшированной (не случайно распределённой), и первичный ключ (уникальный столбец) должен включать все столбцы ключа распределения YMatrix. Кроме того, если таблица партиционирована, ключ должен включать все столбцы ключа партиции. Обратите внимание, что ограничения ключей в партиционированной таблице отличаются от простого 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 задают ограничения ссылочной целостности (внешние ключи). YMatrix принимает ограничения ссылочной целостности в синтаксисе PostgreSQL, но они не проверяются. За информацией об ограничениях ссылочной целостности обращайтесь к документации PostgreSQL.

DEFERRABLE
NOT DEFERRABLE

  • Предложение [NOT] DEFERRABLE управляет возможностью откладывания проверки ограничения. Непереносимое ограничение проверяется сразу после каждого оператора. Вы можете отложить проверку до завершения транзакции (с помощью команды 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-оптимизированную. Если установлено FALSE или не указано, таблица создаётся как обычная heap-таблица.
    • blocksize — задаёт размер каждого блока в таблице (в байтах). Значение blocksize должно быть от 8192 до 2097152 байт и кратно 8192. Значение по умолчанию — 32768.
    • orientation — установите значение column для колоночного хранения или row (по умолчанию) для строкового хранения. Этот параметр действует только при appendoptimized = TRUE. Heap-таблицы могут быть только строково-ориентированными.
    • checksum — этот параметр действителен только для append-оптимизированных таблиц (appendoptimized = TRUE). По умолчанию значение TRUE, что включает проверку CRC-суммы для append-оптимизированных таблиц. CRC-сумма вычисляется при создании блока и сохраняется на диске. Проверка суммы выполняется при чтении блока. Если вычисленная при чтении сумма не совпадает с сохранённой, транзакция прерывается. Если значение установлено в FALSE, проверка отключается, и повреждение данных на диске не обнаруживается.
    • compresstype — установите ZLIB (по умолчанию), ZSTD, RLE_TYPE, QUICKLZ1 или используйте encoding chain MXCUSTOM, чтобы указать тип сжатия. Значение NONE отключает сжатие. ZSTD предлагает выбор между скоростью и степенью сжатия, регулируемой параметром compresslevel. QuickLZ и ZLIB поддерживаются для обратной совместимости. В типичных рабочих нагрузках ZSTD превосходит эти алгоритмы сжатия. Параметр compresstype действует только при appendoptimized = TRUE.
      Значение RLE_TYPE поддерживается только при orientation = column, включая сжатие длин серий (RLE). RLE эффективнее ZSTD, ZLIB или QuickLZ, когда одни и те же значения встречаются во многих последовательных строках.
      Для столбцов типа BIGINT, INTEGER, DATE, TIME или TIMESTAMP применяется также инкрементальное сжатие, если установлено compresstype = RLE_TYPE. Алгоритмы инкрементального сжатия основаны на разностях между значениями столбцов в последовательных строках и предназначены для улучшения сжатия при загрузке данных в отсортированном порядке или применении сжатия к уже отсортированным данным. Если используется цепочка кодирования, конкретный алгоритм должен быть указан с помощью параметра encodechain после compresstype. Подробнее см. Using Compression.

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

    • compresslevel — для сжатия ZSTD append-оптимизированных таблиц укажите целое число от 1 (самое быстрое сжатие) до 19 (наилучшее сжатие). Для ZLIB диапазон — от 1 до 9. Уровень сжатия QuickLZ может быть только 1. По умолчанию — 1. Для RLE_TYPE уровень сжатия — целое число от 1 до 4. Параметр compresslevel действует только при appendoptimized = TRUE.
    • fillfactor — процентное значение от 10 до 100, по умолчанию 100. При меньшем значении оставшееся пространство страницы зарезервировано для обновления строк. Это делает обновления эффективнее, так как обновлённые строки помещаются на ту же страницу, а не рассеиваются по разным. Для таблиц, которые никогда не обновляются, можно использовать значение по умолчанию. Для таблиц с частыми обновлениями значение следует уменьшить. Этот параметр нельзя задавать для TOAST-таблиц.
    • oids=FALSE — значение по умолчанию, OID не присваивается каждой строке. В больших таблицах (например, в типичной системе YMatrix) использование OID может привести к переполнению 32-битного счётчика OID. После переполнения OID перестают быть уникальными, что делает их бесполезными для приложений и вызывает проблемы в системных каталогах YMatrix. Кроме того, исключение OID уменьшает объём хранимых данных на 4 байта на строку, немного улучшая производительность. OID запрещены в партиционированных таблицах и колоночных append-оптимизированных таблицах.
    • Подробные параметры, связанные с MARS2 и MARS3, см. в Storage Engine Principles.

ON COMMIT

  • ON COMMIT позволяет управлять поведением временных таблиц в конце блока транзакции. Возможны три варианта:
    • PRESERVE ROWS — при завершении транзакции над временной таблицей никакие действия не выполняются. Это поведение по умолчанию.
    • DELETE ROWS — все строки временной таблицы удаляются в конце каждого блока транзакции. По сути, каждый коммит автоматически выполняет TRUNCATE.
    • DROP — временная таблица удаляется в конце текущего блока транзакции.

TABLESPACE tablespace

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

USING INDEX TABLESPACE tablespace

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

DISTRIBUTED BY (column [opclass], [ ... ] )
DISTRIBUTED RANDOMLY
DISTRIBUTED REPLICATED

  • Стратегия распределения базы данных YMatrix для объявления таблиц. DISTRIBUTED BY использует хэш-распределение с одним или несколькими столбцами в качестве ключей распределения. Для наиболее равномерного распределения данных ключ распределения должен быть первичным ключом или уникальным столбцом (или набором столбцов). Если это невозможно, можно выбрать DISTRIBUTED RANDOMLY, при котором данные распределяются по принципу round-robin между экземплярами Segments. Также можно указать класс оператора opclass для использования нестандартной хэш-функции.
    Если при создании таблицы не указано предложение DISTRIBUTED BY, поведение будет определяться параметром конфигурации сервера gp_create_table_random_default_distribution. Если стратегия распределения не указана, база данных YMatrix применяет следующие правила:
    • Если указаны предложения LIKE или INHERITS, YMatrix копирует ключ распределения из исходной или родительской таблицы.
    • Если указаны ограничения PRIMARY KEY или UNIQUE, YMatrix выбирает наибольшее подмножество ключевых столбцов в качестве ключа распределения.
    • Если ограничения, LIKE или INHERITS не указаны, YMatrix выбирает первый подходящий столбец в качестве ключа распределения. (Столбцы геометрических или пользовательских типов данных не подходят.)

Если параметр установлен в on, база данных YMatrix применяет следующие правила:

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

Предложение DISTRIBUTED REPLICATED реплицирует всю таблицу на все экземпляры Segments базы данных YMatrix. Его можно использовать, когда функции нуждаются в доступе ко всем строкам таблицы или когда необходимо повысить производительность запросов за счёт исключения Broadcast Motion. Особенно актуально при выполнении пользовательских функций на Segments.

PARTITION BY

  • Объявление одного или нескольких столбцов, используемых для партиционирования таблицы.
    При создании партиционированной таблицы база данных YMatrix создаёт корневую партиционированную таблицу (root partition) с указанным именем. Также создаются таблицы на основе указанных параметров партиционирования — иерархия подтаблиц (подпартиций). Информация о подпартициях содержится в системных представлениях pg_partition*.
    На каждом уровне партиционирования (на каждой иерархическом уровне таблицы) может быть до 32 767 партиций.
    Примечание: База данных YMatrix хранит данные партиционированной таблицы в листовой таблице — самой нижней таблице в иерархии подтаблиц, используемой для партиций.
    • partition_type
      • Указание типа партиции: LIST (список значений) или RANGE (диапазон чисел или дат).
    • partition_specification
      • Определение отдельных партиций. Каждая партиция может быть определена отдельно, или для диапазонных партиций можно использовать предложение EVERY (с START и необязательным END) для определения шага создания партиций.
        DEFAULT PARTITION name — объявление партиции по умолчанию. Данные, не попадающие в существующие партиции, помещаются в эту партицию. Партиционирование без партиции по умолчанию отклоняет строки, не соответствующие ни одной партиции.
        PARTITION name — объявление имени партиции. Имя формируется по шаблону: parentname_level#_prt_givenname.
        VALUES — для LIST-партиций определяет значения, которые будут содержаться в партиции.
        START — для RANGE-партиций определяет начальное значение диапазона. По умолчанию — включительно. Например, если указано start date '2016-01-01', партиция будет содержать все даты >= '2016-01-01'. Обычно тип данных выражения START совпадает с типом столбца ключа партиции. Если нет — требуется явное преобразование.
        END — для RANGE-партиций определяет конечное значение диапазона. По умолчанию — исключительно. Например, если указан end date '2016-02-01', партиция будет содержать все даты < '2016-02-01'. Тип данных выражения END обычно совпадает с типом столбца ключа партиции. При несовпадении требуется явное преобразование.
        EVERY — для RANGE-партиций определяет шаг инкремента от START до END для создания партиций. Тип данных выражения EVERY обычно совпадает с типом столбца ключа партиции. При несовпадении требуется явное преобразование.
        WITH — задаёт параметры хранения для партиций. Например, старые партиции могут быть append-оптимизированными, а новые — обычными heap-таблицами.
        TABLESPACE — имя табличного пространства, в котором будет создана партиция.

SUBPARTITION BY

  • Объявление одного или нескольких столбцов, используемых для подпартиционирования первой партиции таблицы. Формат аналогичен формату вышеуказанного PARTITION BY.

SUBPARTITION TEMPLATE

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

Примечание

  • В базе данных YMatrix (система на основе PostgreSQL) типы данных VARCHAR или TEXT обрабатывают данные, которые популярны как допустимые символы для текста (символ пробела добавляется после последнего непробельного символа); тип данных CHAR этого не делает.
  • В базе данных YMatrix значение типа CHAR(n) дополняется пробелами до указанной ширины n. Значение будет храниться и отображаться как строка с пробелами. Однако дополнение пробелами не имеет семантического значения. При присваивании значений завершающие пробелы игнорируются. При сравнении двух значений типа CHAR завершающие пробелы семантически не важны, а также удаляются при преобразовании строковых значений в другой строковой тип.
  • Использование OID в новых приложениях не рекомендуется: по возможности лучше использовать SERIAL или другие генераторы последовательностей в качестве первичного ключа таблицы. Однако если ваше приложение использует OID для идентификации конкретной строки таблицы, рекомендуется создать уникальное ограничение на столбец OID этой таблицы, чтобы обеспечить уникальную идентификацию строк даже после переполнения счётчика. Не следует предполагать, что OID уникальны между таблицами; если требуется глобальный уникальный идентификатор для всей базы данных, можно использовать комбинацию OID таблицы и OID строки.
  • В базе данных YMatrix существуют особые условия для ограничений первичного ключа и столбцов, являющихся ключами распределения в таблице YMatrix. Чтобы применять уникальные ограничения в базе данных YMatrix, таблица должна быть хэшированной (не DISTRIBUTED RANDOMLY), а столбец ограничения должен совпадать со столбцом ключа распределения таблицы (или быть его надмножеством). Кроме того, ключ распределения должен быть левым подмножеством столбцов ограничения, и столбцы должны находиться в правильном порядке. Например, если первичный ключ — (a,b,c), то ключ распределения может быть только одним из следующих: (a), (a,b) или (a,b,c).
    Для DISSTRIBUTED REPLICATED разрешены ограничения PRIMARY KEY и UNIQUE.
    Ограничения первичного ключа представляют собой просто комбинацию уникальных ограничений и ограничений NOT NULL.
    База данных YMatrix автоматически создаёт уникальный индекс для каждого ограничения UNIQUE или PRIMARY KEY, чтобы обеспечить уникальность. Следовательно, нет необходимости явно создавать индекс для столбца первичного ключа. Ограничения UNIQUE и PRIMARY KEY не допускаются для таблиц с оптимизацией вставок, поскольку уникальные индексы, созданные ограничениями, не поддерживаются в таких таблицах.
    В базе данных YMatrix не поддерживаются внешние ключи (foreign key constraints).
    Для наследуемых таблиц в текущей реализации уникальные ограничения, ограничения первичного ключа, индексы и привилегии на таблицу не наследуются.
  • Для таблиц с оптимизацией вставок операции UPDATE и DELETE запрещены в транзакциях уровня повторяющегося чтения (repeatable read) или сериализуемого уровня (serializable), что приведёт к прерыванию транзакции. Команды CLUSTER, DECLARE...FOR UPDATE и триггеры не поддерживают таблицы с оптимизацией вставок.
  • Чтобы вставить данные в секционированную таблицу, укажите корневую секционированную таблицу — ту, которая была создана с помощью команды CREATE TABLE. Вы также можете указать конечную таблицу (лист) секционированной таблицы в команде INSERT. Если данные недопустимы для указанной конечной таблицы, будет возвращена ошибка. Указание подтаблиц, не являющихся конечными, в команде INSERT не поддерживается. Выполнение других DML-команд, таких как UPDATE и DELETE, для любых подтаблиц секционированной таблицы не поддерживается. Эти команды должны выполняться только на корневой секционированной таблице (таблице, созданной с помощью команды CREATE TABLE).

Пример

Создать таблицу с именем 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);

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

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 <> '')
);

Создать сжатую с помощью 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')
) ;

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

## Create SEGMENT_SET object ss1
CREATE SEGMENT_SET ss1 SEGMENTS('0,2');

## Create a t table
CREATE TABLE t(a int, b int) DISTRIBUTED BY(a) PARTITION BY RANGE(b) (DEFAULT PARTITION others SEGMENT_SET ss1);

## Specify the SEGMENT_SET object for the new partition
CREATE TABLE t_part_manual PARTITION OF t FOR VALUES FROM (3) TO (6) SEGMENT_SET ss1;

Создать таблицу MARS2. Таблицы MARS2 зависят от расширения matrixts. Перед созданием таблицы необходимо сначала создать расширение в базе данных с использованием механизма хранения.

CREATE EXTENSION matrixts;

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

CREATE TABLE t (
      f1 int8
    , f2 int8
) 
USING MARS2
WITH(
      compresstype=mxcustom
);

Создать таблицу, в которой указаны сжатие на уровне таблицы и на уровне столбцов. Спецификация сжатия на уровне столбцов имеет приоритет над уровнем таблицы (за исключением столбцов, где указано ENCODING(compresstype=none)/ENCODING(minmax)). Подробности см. в разделе Использование сжатия.

CREATE TABLE t (
      f1 int8 ENCODING(compresstype=lz4)
    , f2 int8
) 
USING MARS2
WITH(
      compresstype=mxcustom
    , encodechain=auto
);
CREATE INDEX idx_mars2 ON t USING mars2_btree(f1);

Примечание!
matrixts распространяется на уровень базы данных, и его достаточно создать один раз в базе данных, без необходимости повторного создания.

CREATE TABLE disk_mars2(
    time timestamp with time zone,
    tag_id int,
    read float,
    write float
)
USING MARS2
WITH (compresstype=zstd, compresslevel=3)
DISTRIBUTED BY (tag_id);
CREATE INDEX ON disk_mars2 USING mars2_btree(time,tag_id);

Создать таблицу MARS3. Таблица MARS3 также зависит от расширения matrixts. Перед созданием таблицы необходимо сначала создать расширение в базе данных с использованием механизма хранения.

CREATE EXTENSION matrixts;
CREATE TABLE t(
    time timestamp with time zone,
    tag_id int,
    i4 int4,
    i8 int8
)
USING MARS3
WITH (compresstype=zstd, compresslevel=3,compress_threshold=1200,
        mars3options='rowstore_size=64,prefer_load_mode=normal,level_size_amplifier=8')
DISTRIBUTED BY (tag_id)
ORDER BY (time, tag_id);

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

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

  • Временные таблицы — в стандарте SQL временные таблицы определяются только один раз и автоматически существуют в каждой сессии, где они требуются (начиная с пустого содержимого). Вместо этого база данных YMatrix требует, чтобы каждая сессия выполняла собственную команду CREATE TEMPORARY TABLE для каждой временной таблицы, которую она собирается использовать. Это позволяет разным сессиям использовать одно и то же имя временной таблицы для разных целей, тогда как подход стандарта требует, чтобы все экземпляры заданного имени временной таблицы имели одну и ту же структуру.
    Различие между глобальными и локальными временными таблицами по стандарту в базе данных YMatrix отсутствует. База данных YMatrix принимает ключевые слова GLOBAL и LOCAL в объявлении временной таблицы, но они являются недействительными и устаревшими.
    Если предложение ON COMMIT опущено, стандарт SQL определяет поведение по умолчанию как ON COMMIT DELETE ROWS. Однако поведение по умолчанию в базе данных YMatrix — ON COMMIT PRESERVE ROWS. Опция ON COMMIT DROP отсутствует в стандарте SQL.

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

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

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

  • Секционирование — секционирование таблиц через предложение PARTITION BY является расширением языка базы данных YMatrix.

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

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

  • WITH — предложение WITH является расширением базы данных YMatrix. Параметры хранения и OID не входят в стандарт.

  • Табличные пространства — концепция табличных пространств в базе данных YMatrix не является частью стандарта SQL. Предложения TABLESPACE и USING INDEX TABLESPACE являются расширениями.

  • Распределение данных — концепция параллельных или распределённых баз данных в YMatrix не является частью стандарта SQL. Предложение DISTRIBUTED является расширением.

См. также

ALTER TABLE, DROP TABLE, CREATE SEGMENT SET