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 |
Если указано, таблица создается как временная.
Временные таблицы автоматически удаляются в конце сеанса, либо (опционально) в конце текущей транзакции (см. |
UNLOGGED |
Если указано, таблица создается как нежурналируемая (unlogged). Данные, записываемые в unlogged-таблицы, не записываются в журнал предзаписи (WAL), что делает такие таблицы значительно быстрее обычных. Однако содержимое unlogged-таблицы не реплицируется на зеркальные (mirror) экземпляры сегментов. Кроме того, unlogged-таблица не обеспечивает устойчивость к аварийному завершению. После падения сегмента или некорректного завершения работы данные unlogged-таблицы на этом сегменте усекаются (truncated). Любые индексы, созданные на unlogged-таблице, автоматически становятся unlogged |
table_name |
Имя (опционально с указанием схемы) создаваемой таблицы |
OF <type_name> |
Создает типизированную таблицу (typed table), структура которой берется из указанного составного типа (имя типа — опционально с указанием схемы).
Типизированная таблица связана со своим типом; например, таблица будет удалена, если удалить тип (через При создании типизированной таблицы типы данных столбцов определяются базовым составным типом и не указываются в команде |
column_name |
Имя столбца, создаваемого в новой таблице |
data_type |
Тип данных столбца. Может включать спецификаторы массивов. Для столбцов, содержащих текстовые данные, указывайте тип |
COLLATE <collation> |
Выражение ПРИМЕЧАНИЕ
GPORCA поддерживает правило сортировки, только когда все столбцы в запросе используют одно и то же правило сортировки. Если столбцы в запросе используют разные правила сортировки, Greengage DB использует планировщик Postgres. |
DEFAULT <default_expr> |
Выражение |
ENCODING ( <storage_directive> [, …] ) |
Для столбца необязательное выражение Выражение допустимо только для append-optimized таблиц с колоночной ориентацией. Настройки сжатия столбцов наследуются от уровня таблицы к уровню партиции (partition) и к уровню подпартиции (subpartition). Настройки на самом нижнем уровне имеют приоритет |
INHERITS ( <parent_table> [, …] ) |
Необязательное выражение В Greengage DB выражение Если одно и то же имя столбца существует более чем в одной родительской таблице, будет сообщено об ошибке, если типы данных столбцов не совпадают в каждой из родительских таблиц. Если конфликта нет, дублирующиеся столбцы объединяются в один столбец в новой таблице. Если список столбцов новой таблицы содержит имя столбца, который также наследуется, тип данных должен так же совпадать с наследуемым(и) столбцом(ами), и определения столбцов объединяются в одно. Если новая таблица явно задает значение по умолчанию для столбца, это значение перекрывает любые значения по умолчанию из наследуемых объявлений столбца. Иначе все родители, задающие значения по умолчанию для столбца, должны задавать одно и то же значение по умолчанию, либо будет сообщено об ошибке. Ограничения Настройки столбцов |
LIKE <source_table> [ <like_option> … ] |
Выражение ПРИМЕЧАНИЕ
Свойства хранения, такие как append-optimized или структура партиционирования, не копируются. Выражения по умолчанию для скопированных определений столбцов копируются, только если указано Ограничения not-null всегда копируются в новую таблицу.
Ограничения Индексы, ограничения Любые индексы исходной таблицы не будут созданы в новой таблице, если только не указано выражение Настройки Комментарии для скопированных столбцов, ограничений и индексов копируются, только если указано
Обратите внимание: в отличие от Выражение |
CONSTRAINT <constraint_name> |
Необязательное имя (описание) для ограничения столбца или таблицы.
Если ограничение нарушено, имя ограничения присутствует в сообщениях об ошибке, поэтому имена вроде ПРИМЕЧАНИЕ
Имя, указанное в качестве |
NULL | NOT NULL |
Задает, разрешено или запрещено столбцу содержать значения null.
По умолчанию используется |
CHECK (<expression>) [ NO INHERIT ] |
Задает выражение, вычисляющее логический результат, которому должны удовлетворять новые или изменяемые строки, чтобы операция Ограничение, помеченное В настоящее время выражения |
UNIQUE (<column_constraint>) UNIQUE (<column_name> [, …]) (<table_constraint>) |
Ограничение Информацию об управлении и ограничениях для |
PRIMARY KEY (<column_constraint>) PRIMARY KEY (<column_name> [, …]) (<table_constraint>) |
Ограничение Чтобы таблица могла иметь первичный ключ, она должна быть хеш-распределенной (не распределенной случайно) и первичный ключ (уникальные столбцы) должен включать все столбцы ключа распределения.
Кроме того, если таблица партиционирована, ключ должен включать все столбцы ключа партиционирования.
Обратите внимание: ограничение ключа в партиционированной таблице — это не то же самое, что простой
Информацию об управлении и ограничениях для первичного ключа см. в Примечания |
REFERENCES <reftable> [ ( <refcolumn> ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ON DELETE | ON UPDATE] <key_action> FOREIGN KEY (<column_name> [, …]) |
Выражения |
[NOT] DEFERRABLE |
Выражение |
INITIALLY IMMEDIATE INITIALLY DEFERRED |
Если ограничение можно откладывать, это выражение задает время проверки ограничения по умолчанию.
Если ограничение |
WITH (<storage_parameter>=<value>) |
Выражение Значения по умолчанию для некоторых опций хранения таблиц можно задать параметром конфигурации сервера Доступны следующие опции хранения:
|
ON COMMIT |
Поведение временных таблиц в конце блока транзакции можно управлять с помощью
|
TABLESPACE <tablespace> |
Имя табличного пространства (tablespace), в котором должна быть создана новая таблица |
USING INDEX TABLESPACE <tablespace> |
Позволяет выбрать табличное пространство, в котором будет создан индекс, связанный с ограничением |
DISTRIBUTED BY (<column> [<opclass>], [ … ]) DISTRIBUTED RANDOMLY DISTRIBUTED REPLICATED |
Объявляет политику распределения Greengage DB для таблицы.
Параметр конфигурации сервера Greengage DB Если значение параметра
Если значение параметра
Выражение |
PARTITION BY |
Объявляет один или несколько столбцов, по которым требуется партиционировать таблицу. При создании партиционированной таблицы Greengage DB создает корневую партиционированную таблицу (корневую партицию) с указанным именем таблицы. Greengage DB также создает иерархию дочерних таблиц, которые являются подпартициями на основе указанных опций партиционирования. Для каждого уровня партиционирования таблица может иметь максимум 32767 партиций. ПРИМЕЧАНИЕ
Greengage DB хранит данные партиционированной таблицы в листовых дочерних таблицах (leaf), то есть в таблицах самого нижнего уровня иерархии, используемой партиционированной таблицей. |
partition_type |
Объявляет тип партиционирования: |
partition_specification |
Объявляет отдельные партиции, которые нужно создать.
Каждую партицию можно определить индивидуально, либо (для партиций на основе диапазонов) можно использовать выражение
|
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— расширения.