13.1.18 Оператор CREATE TABLE
- 13.1.18.1 Файлы, созданные оператором CREATE TABLE
- 13.1.18.2 Оператор CREATE TEMPORARY TABLE
- 13.1.18.3 Оператор CREATE TABLE ... LIKE
- 13.1.18.4 Оператор CREATE TABLE ... SELECT
- 13.1.18.5 Ограничения FOREIGN KEY
- 13.1.18.6 Неявные изменения спецификаций столбцов
- 13.1.18.7 CREATE TABLE и сгенерированные столбцы
- 13.1.18.8 Вторичные индексы и сгенерированные столбцы
- 13.1.18.9 Настройка параметров комментариев NDB
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,...)
[table_options]
[partition_options]
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
[table_options]
[partition_options]
[IGNORE | REPLACE]
[AS] query_expression
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
{ LIKE old_tbl_name | (LIKE old_tbl_name) }
create_definition: {
col_name column_definition
| {INDEX | KEY} [index_name] [index_type] (key_part,...)
[index_option] ...
| {FULLTEXT | SPATIAL} [INDEX | KEY] [index_name] (key_part,...)
[index_option] ...
| [CONSTRAINT [symbol]] PRIMARY KEY
[index_type] (key_part,...)
[index_option] ...
| [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY]
[index_name] [index_type] (key_part,...)
[index_option] ...
| [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (col_name,...)
reference_definition
| CHECK (expr)
}
column_definition: {
data_type [NOT NULL | NULL] [DEFAULT default_value]
[AUTO_INCREMENT] [UNIQUE [KEY]] [[PRIMARY] KEY]
[COMMENT 'string']
[COLLATE collation_name]
[COLUMN_FORMAT {FIXED | DYNAMIC | DEFAULT}]
[STORAGE {DISK | MEMORY}]
[reference_definition]
| data_type
[COLLATE collation_name]
[GENERATED ALWAYS] AS (expr)
[VIRTUAL | STORED] [NOT NULL | NULL]
[UNIQUE [KEY]] [[PRIMARY] KEY]
[COMMENT 'string']
[reference_definition]
}
data_type:
(see Chapter 11, Data Types)
key_part:
col_name [(length)] [ASC | DESC]
index_type:
USING {BTREE | HASH}
index_option: {
KEY_BLOCK_SIZE [=] value
| index_type
| WITH PARSER parser_name
| COMMENT 'string'
}
reference_definition:
REFERENCES tbl_name (key_part,...)
[MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
[ON DELETE reference_option]
[ON UPDATE reference_option]
reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
table_options:
table_option [[,] table_option] ...
table_option: {
AUTO_INCREMENT [=] value
| AVG_ROW_LENGTH [=] value
| [DEFAULT] CHARACTER SET [=] charset_name
| CHECKSUM [=] {0 | 1}
| [DEFAULT] COLLATE [=] collation_name
| COMMENT [=] 'string'
| COMPRESSION [=] {'ZLIB' | 'LZ4' | 'NONE'}
| CONNECTION [=] 'connect_string'
| {DATA | INDEX} DIRECTORY [=] 'absolute path to directory'
| DELAY_KEY_WRITE [=] {0 | 1}
| ENCRYPTION [=] {'Y' | 'N'}
| ENGINE [=] engine_name
| INSERT_METHOD [=] { NO | FIRST | LAST }
| KEY_BLOCK_SIZE [=] value
| MAX_ROWS [=] value
| MIN_ROWS [=] value
| PACK_KEYS [=] {0 | 1 | DEFAULT}
| PASSWORD [=] 'string'
| ROW_FORMAT [=] {DEFAULT | DYNAMIC | FIXED | COMPRESSED | REDUNDANT | COMPACT}
| STATS_AUTO_RECALC [=] {DEFAULT | 0 | 1}
| STATS_PERSISTENT [=] {DEFAULT | 0 | 1}
| STATS_SAMPLE_PAGES [=] value
| tablespace_option
| UNION [=] (tbl_name[,tbl_name]...)
}
partition_options:
PARTITION BY
{ [LINEAR] HASH(expr)
| [LINEAR] KEY [ALGORITHM={1 | 2}] (column_list)
| RANGE{(expr) | COLUMNS(column_list)}
| LIST{(expr) | COLUMNS(column_list)} }
[PARTITIONS num]
[SUBPARTITION BY
{ [LINEAR] HASH(expr)
| [LINEAR] KEY [ALGORITHM={1 | 2}] (column_list) }
[SUBPARTITIONS num]
]
[(partition_definition [, partition_definition] ...)]
partition_definition:
PARTITION partition_name
[VALUES
{LESS THAN {(expr | value_list) | MAXVALUE}
|
IN (value_list)}]
[[STORAGE] ENGINE [=] engine_name]
[COMMENT [=] 'string' ]
[DATA DIRECTORY [=] 'data_dir']
[INDEX DIRECTORY [=] 'index_dir']
[MAX_ROWS [=] max_number_of_rows]
[MIN_ROWS [=] min_number_of_rows]
[TABLESPACE [=] tablespace_name]
[(subpartition_definition [, subpartition_definition] ...)]
subpartition_definition:
SUBPARTITION logical_name
[[STORAGE] ENGINE [=] engine_name]
[COMMENT [=] 'string' ]
[DATA DIRECTORY [=] 'data_dir']
[INDEX DIRECTORY [=] 'index_dir']
[MAX_ROWS [=] max_number_of_rows]
[MIN_ROWS [=] min_number_of_rows]
[TABLESPACE [=] tablespace_name]
tablespace_option:
TABLESPACE tablespace_name [STORAGE DISK]
| [TABLESPACE tablespace_name] STORAGE MEMORY
query_expression:
SELECT ... (Some valid select or union statement)
CREATE TABLE создаёт таблицу с заданным именем. Для этого необходимо иметь привилегию CREATE для таблицы.
По умолчанию таблицы создаются в базе данных по умолчанию, используя движок хранения InnoDB. Возникает ошибка, если таблица уже существует, базы данных по умолчанию нет или она не существует.
В MySQL нет ограничений на количество таблиц. Базовая файловая система может иметь ограничения на количество файлов, представляющих таблицы. Отдельные движки хранения могут накладывать специфические ограничения. InnoDB позволяет создать до 4 миллиардов таблиц.
Сведения о физическом представлении таблицы см. в Разделе 13.1.18.1, “Файлы, созданные оператором CREATE TABLE”.
Оператор CREATE
TABLE имеет несколько аспектов, описанных в следующих разделах этой секции:
Имя таблицы
-
tbl_nameИмя таблицы можно указать как
db_name.tbl_name, чтобы создать таблицу в конкретной базе данных. Это работает независимо от наличия базы данных по умолчанию, если база данных существует. Если вы используете кавычки для идентификаторов, укажите кавычки для имени базы данных и имени таблицы отдельно. Например, напишите`mydb`.`mytbl`, а не`mydb.mytbl`.Правила допустимых имён таблиц приведены в Разделе 9.2, “Имена объектов схемы”.
-
IF NOT EXISTSПредотвращает ошибку, если таблица уже существует. Однако нет проверки на то, что существующая таблица имеет структуру, идентичную той, что указана в операторе
CREATE TABLE.
Временные таблицы
При создании таблицы можно использовать ключевое слово TEMPORARY. TEMPORARY таблица видна только в текущей сессии и автоматически удаляется при закрытии сессии. Дополнительную информацию см. в Разделе 13.1.18.2, “Оператор CREATE TEMPORARY TABLE”.
Клонирование и копирование таблиц
-
LIKEИспользуйте
CREATE TABLE ... LIKEдля создания пустой таблицы на основе определения другой таблицы, включая любые атрибуты столбцов и индексы, определённые в исходной таблице:CREATE TABLE
new_tblLIKEorig_tbl;Дополнительную информацию см. в Разделе 13.1.18.3, “Оператор CREATE TABLE ... LIKE”.
-
[AS]query_expressionДля создания одной таблицы из другой добавьте оператор
SELECTв конце оператораCREATE TABLE:CREATE TABLE
new_tblAS SELECT * FROMorig_tbl;Дополнительную информацию см. в Разделе 13.1.18.4, “Оператор CREATE TABLE ... SELECT”.
-
IGNORE | REPLACEПараметры
IGNOREиREPLACEуказывают, как обрабатывать строки, дублирующие уникальные значения ключей, при копировании таблицы с помощью оператораSELECT.Дополнительную информацию см. в Разделе 13.1.18.4, “Оператор CREATE TABLE ... SELECT”.
Типы данных столбцов и их атрибуты
Жесткое ограничение — 4096 столбцов на таблицу, но эффективное максимальное значение может быть меньше для конкретной таблицы и зависит от факторов, обсуждаемых в Разделе 8.4.7, “Ограничения на количество столбцов таблицы и размер строки”.
-
data_typedata_typeобозначает тип данных в определении столбца. Для получения полного описания синтаксиса, используемого для указания типов данных столбцов, а также информации о свойствах каждого типа, см. Главу 11, Типы данных.Некоторые атрибуты не применяются ко всем типам данных.
AUTO_INCREMENTприменяется только к целым и дробным типам.DEFAULTне применяется к типамBLOB,TEXT,GEOMETRYиJSON.-
Типы данных символьных данных (
CHAR,VARCHAR, типыTEXT,ENUM,SETи любые синонимы) могут включатьCHARACTER SETдля указания набора символов для столбца.CHARSETявляется синонимом дляCHARACTER SET. Коллирование для набора символов можно указать с помощью атрибутаCOLLATE, а также любых других атрибутов. Подробности см. в Главе 10, Наборы символов, кодировки, Unicode. Пример:CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
MySQL 5.7 интерпретирует спецификации длины в определениях столбцов символьных данных в символах. Длины для
BINARYиVARBINARYуказаны в байтах. -
Для столбцов
CHAR,VARCHAR,BINARYиVARBINARYможно создавать индексы, использующие только начальную часть значений столбца, используя синтаксисдля указания длины префикса индекса. Столбцыcol_name(length)BLOBиTEXTтакже могут быть индексированы, но длина префикса должна быть указана. Длины префиксов указываются в символах для типов строк, не являющихся двоичными, и в байтах для двоичных типов строк. То есть, записи индекса состоят из первыхlengthсимволов каждого значения столбца для столбцовCHAR,VARCHARиTEXTи первыхlengthбайтов каждого значения столбца для столбцовBINARY,VARBINARYиBLOB. Индексирование только префикса значений столбцов таким образом может значительно уменьшить размер файла индекса. Дополнительную информацию об индексах префиксов см. в Разделе 13.1.14, “Выполнение инструкции CREATE INDEX”.Только движки хранения
InnoDBиMyISAMподдерживают индексирование столбцовBLOBиTEXT. Например:CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
Начиная с MySQL 5.7.17, если указанный префикс индекса превышает максимальный размер данных типа столбца,
CREATE TABLEобрабатывает индекс следующим образом:Для не уникального индекса происходит либо ошибка (если включен строгий режим SQL), либо длина индекса уменьшается до соответствия максимальному размеру данных типа столбца, и генерируется предупреждение (если строгий режим SQL не включен).
Для уникального индекса возникает ошибка независимо от режима SQL, так как сокращение длины индекса может позволить вставить не уникальные записи, которые не соответствуют требованиям уникальности.
Столбцы
JSONне могут быть индексированы. Вы можете обойти это ограничение, создав индекс на сгенерированном столбце, который извлекает скалярное значение из столбцаJSON. См. Индексирование сгенерированного столбца для предоставления индекса столбца JSON для подробного примера.
-
NOT NULL | NULLЕсли ни
NULL, ниNOT NULLне указаны, столбец обрабатывается так, как будто был указанNULL.В MySQL 5.7 только движки хранения
InnoDB,MyISAMиMEMORYподдерживают индексы на столбцах, которые могут содержать значенияNULL. В других случаях вы должны объявить индексируемые столбцы какNOT NULL, в противном случае произойдет ошибка. -
DEFAULTУстанавливает значение по умолчанию для столбца. Для получения дополнительной информации о обработке значений по умолчанию, в том числе в случае, когда в определении столбца нет явного значения
DEFAULT, см. Раздел 11.6, “Значения по умолчанию для типов данных”.Если режим SQL
NO_ZERO_DATEилиNO_ZERO_IN_DATEвключен, а значение по умолчанию даты не соответствует этому режиму,CREATE TABLEгенерирует предупреждение, если строгий режим SQL не включен, и ошибку, если включен. Например, с включеннымNO_ZERO_IN_DATE,c1 DATE DEFAULT '2010-00-00'генерирует предупреждение. -
AUTO_INCREMENTСтолбец с целым или дробным типом данных может иметь дополнительный атрибут
AUTO_INCREMENT. При вставке значенияNULL(рекомендуется) или0в индексируемый столбецAUTO_INCREMENT, столбец устанавливается на следующее значение последовательности. Обычно это, гдеvalue+1value- это наибольшее значение для столбца в таблице в данный момент. ПоследовательностиAUTO_INCREMENTначинаются с1.Для получения значения
AUTO_INCREMENTпосле вставки строки используйте функцию SQLLAST_INSERT_ID()или функцию C API. См. Раздел 12.15, “Функции информации” и .Если режим SQL
NO_AUTO_VALUE_ON_ZEROвключен, вы можете хранить0в столбцахAUTO_INCREMENTкак0без генерации нового значения последовательности. См. Раздел 5.1.10, “Режимы SQL сервера”.Может быть только один столбец
AUTO_INCREMENTна таблицу, он должен быть индексирован и не может иметь значение по умолчаниюDEFAULT. СтолбецAUTO_INCREMENTработает корректно только если он содержит только положительные значения. Вставка отрицательного числа рассматривается как вставка очень большого положительного числа. Это делается для предотвращения проблем с точностью, когда числа “переворачиваются” с положительных на отрицательные, а также для гарантии, что столбецAUTO_INCREMENTне содержит0.Для таблиц
MyISAMвы можете указать столбецAUTO_INCREMENTво вторичном ключе из нескольких столбцов. См. Раздел 3.6.9, “Использование AUTO_INCREMENT”.Для обеспечения совместимости MySQL с некоторыми приложениями ODBC, вы можете найти значение
AUTO_INCREMENTдля последней вставленной строки с помощью следующего запроса:SELECT * FROM
tbl_nameWHEREauto_colIS NULLЭтот метод требует, чтобы переменная
sql_auto_is_nullне была установлена в 0. См. Раздел 5.1.7, “Системные переменные сервера”.Для информации о
InnoDBиAUTO_INCREMENTсм. Раздел 14.6.1.6, “Обработка AUTO_INCREMENT в InnoDB”. Для информации оAUTO_INCREMENTи репликации MySQL см. Раздел 16.4.1.1, “Репликация и AUTO_INCREMENT”.
-
COMMENTКомментарий к столбцу можно указать с помощью опции
COMMENT, длиной до 1024 символов. Комментарий отображается операторамиSHOW CREATE TABLEиSHOW FULL COLUMNS. Он также отображается в столбцеCOLUMN_COMMENTтаблицы Information SchemaCOLUMNS. -
COLUMN_FORMATВ NDB Cluster также можно указать формат хранения данных для отдельных столбцов таблиц
NDBс помощьюCOLUMN_FORMAT. Разрешенные форматы столбцов —FIXED,DYNAMICиDEFAULT.FIXEDиспользуется для указания хранения фиксированной ширины,DYNAMICпозволяет сделать столбец переменной ширины, аDEFAULTзаставляет столбец использовать хранение фиксированной или переменной ширины, в зависимости от типа данных столбца (возможно, переопределено спецификаторомROW_FORMAT).Начиная с MySQL NDB Cluster 7.5.4, для таблиц
NDB, значение по умолчанию дляCOLUMN_FORMAT—FIXED. (Значение по умолчанию было изменено наDYNAMICв MySQL NDB Cluster 7.5.1, но это изменение было отменено для сохранения обратной совместимости с существующими версиями релизов.) (Ошибка #24487363)В NDB Cluster максимальный возможный смещение для столбца, определенного с помощью
COLUMN_FORMAT=FIXED, составляет 8188 байт. Более подробная информация и возможные обходные пути приведены в разделе 21.2.7.5, «Ограничения, связанные с объектами базы данных в NDB Cluster».COLUMN_FORMATв настоящее время не влияет на столбцы таблиц, использующих движки хранения, отличные отNDB. В MySQL 5.7 и более поздних версияхCOLUMN_FORMATигнорируется. -
STORAGEДля таблиц
NDBможно указать, хранится ли столбец на диске или в памяти, используя предложениеSTORAGE.STORAGE DISKзаставляет столбец храниться на диске, аSTORAGE MEMORY— использовать хранение в памяти. ОператорCREATE TABLE, используемый, должен по-прежнему содержать предложениеTABLESPACE:mysql>
CREATE TABLE t1 (->c1 INT STORAGE DISK,->c2 INT STORAGE MEMORY->) ENGINE NDB;ERROR 1005 (HY000): Can't create table 'c.t1' (errno: 140) mysql>CREATE TABLE t1 (->c1 INT STORAGE DISK,->c2 INT STORAGE MEMORY->) TABLESPACE ts_1 ENGINE NDB;Query OK, 0 rows affected (1.06 sec)Для таблиц
NDB,STORAGE DEFAULTэквивалентноSTORAGE MEMORY.Предложение
STORAGEне влияет на таблицы, использующие движки хранения, отличные отNDB. Ключевое словоSTORAGEподдерживается только в сборке mysqld, поставляемой с NDB Cluster; оно не распознаётся в других версиях MySQL, где любая попытка использовать ключевое словоSTORAGEприводит к синтаксической ошибке. -
GENERATED ALWAYSИспользуется для указания выражения вычисляемого столбца. Подробная информация о этом доступна в разделе 13.1.18.7, «CREATE TABLE и вычисляемые столбцы».
могут быть индексированы.
InnoDBподдерживает вторичные индексы на . См. раздел 13.1.18.8, «Вторичные индексы и вычисляемые столбцы».
Индексы и внешние ключи
Некоторые ключевые слова применяются к созданию индексов и внешних ключей. Для общего контекста, помимо следующих описаний, см. раздел 13.1.14, «Оператор CREATE INDEX» и раздел 13.1.18.5, «Ограничения FOREIGN KEY».
-
CONSTRAINTsymbolОператор
CONSTRAINTможет использоваться для указания ограничения. Если оператор не указан илиsymbolsymbolне включён после ключевого словаCONSTRAINT, MySQL автоматически сгенерирует имя ограничения, за исключением случаев, указанных ниже. Значениеsymbol, если используется, должно быть уникальным для схемы (базы данных), для типа ограничения. Повторное использованиеsymbolприведёт к ошибке. Также см. обсуждение ограничений длины сгенерированных идентификаторов ограничений в разделе 9.2.1, «Ограничения длины идентификаторов».ПримечаниеЕсли оператор
CONSTRAINTне указан в определении внешнего ключа илиsymbolsymbolне включён после ключевого словаCONSTRAINT,NDBиспользует имя индекса внешнего ключа.Стандарт SQL определяет, что все типы ограничений (первичный ключ, уникальный индекс, внешний ключ, условие) относятся к одному пространству имён. В MySQL каждый тип ограничения имеет собственное пространство имён для каждой схемы. Следовательно, имена каждого типа ограничения должны быть уникальными для каждой схемы.
-
PRIMARY KEYУникальный индекс, где все столбцы ключа должны быть определены как
NOT NULL. Если они не явно объявлены какNOT NULL, MySQL объявляет их неявно (и молчаливо). В таблице может быть только одинPRIMARY KEY. ИмяPRIMARY KEYвсегдаPRIMARY, и поэтому не может использоваться в качестве имени любого другого типа индекса.Если у вас нет
PRIMARY KEYи приложение запрашиваетPRIMARY KEYв ваших таблицах, MySQL возвращает первый индексUNIQUE, который не имеет столбцовNULL, какPRIMARY KEY.В таблицах
InnoDBподдерживайтеPRIMARY KEYкоротким, чтобы минимизировать нагрузку на хранение для вторичных индексов. Каждая запись вторичного индекса содержит копию столбцов первичного ключа для соответствующей строки. (См. раздел 14.6.2.1, «Кластеризованные и вторичные индексы».)В созданной таблице
PRIMARY KEYразмещается первым, за ним следуют всеUNIQUEиндексы, а затем — не уникальные индексы. Это помогает оптимизатору MySQL в приоритетном выборе индекса для использования и также быстрее обнаруживать дублированныеUNIQUEключи.PRIMARY KEYможет быть индексом с несколькими столбцами. Однако вы не можете создать индекс с несколькими столбцами, используя атрибут ключаPRIMARY KEYв спецификации столбца. Это лишь помечает этот столбец как первичный. Вы должны использовать отдельный операторPRIMARY KEY(.key_part, ...)Если таблица имеет
PRIMARY KEYилиUNIQUE NOT NULLиндекс, состоящий из одного столбца целого типа, вы можете использовать_rowidдля ссылки на индексированный столбец в операцияхSELECT, как описано в разделе «Уникальные индексы».В MySQL имя
PRIMARY KEYявляетсяPRIMARY. Для других индексов, если вы не присвоите имя, индексу будет присвоено имя первого индексированного столбца с необязательным суффиксом (_2,_3,...), чтобы сделать его уникальным. Вы можете просмотреть имена индексов для таблицы с помощьюSHOW INDEX FROM. См. раздел 13.7.5.22, «Выражение SHOW INDEX».tbl_name -
KEY | INDEXKEYобычно является синонимом дляINDEX. Атрибут ключаPRIMARY KEYтакже может быть указан как простоKEYпри указании в определении столбца. Это было реализовано для совместимости с другими системами баз данных. -
UNIQUEИндекс
UNIQUEсоздаёт ограничение, такое, что все значения в индексе должны быть различными. Возникает ошибка, если вы пытаетесь добавить новую строку со значением ключа, соответствующим существующей строке. Для всех движков индексUNIQUEдопускает несколько значенийNULLдля столбцов, которые могут содержатьNULL. Если вы указываете значение префикса для столбца в индексеUNIQUE, значения столбцов должны быть уникальными в пределах длины префикса.Если таблица имеет
PRIMARY KEYилиUNIQUE NOT NULLиндекс, состоящий из одного столбца целого типа, вы можете использовать_rowidдля ссылки на индексированный столбец в операцияхSELECT, как описано в разделе «Уникальные индексы». -
FULLTEXTИндекс
FULLTEXT— это специальный тип индекса, используемый для полнотекстового поиска. Только движки храненияInnoDBиMyISAMподдерживают индексыFULLTEXT. Они могут быть созданы только из столбцовCHAR,VARCHARиTEXT. Индексация всегда происходит по всему столбцу; индексация по префиксу столбца не поддерживается, и любая указанная длина префикса игнорируется. Подробности работы см. в разделе 12.9, «Функции полнотекстового поиска». ОператорWITH PARSERможет быть указан как значениеindex_optionдля ассоциации плагина анализатора с индексом, если операции полнотекстовой индексации и поиска требуют специальной обработки. Этот оператор допустим только для индексовFULLTEXT. КакInnoDB, так иMyISAMподдерживают плагины анализаторов полнотекстового поиска. Дополнительную информацию см. на страницах Плагины анализаторов полнотекстового поиска и Создание плагинов анализаторов полнотекстового поиска. -
SPATIALВы можете создавать индексы
SPATIALна пространственных типах данных. Пространственные типы поддерживаются только для таблицMyISAMиInnoDB, а индексированные столбцы должны быть объявлены какNOT NULL. См. раздел 11.4, «Пространственные типы данных». -
FOREIGN KEYMySQL поддерживает внешние ключи, позволяющие вам создавать перекрёстные ссылки на связанные данные между таблицами, и ограничения внешних ключей, которые помогают поддерживать целостность этих разнесённых данных. Для получения информации об определении и опциях см.
reference_definitionиreference_option.Разделённые таблицы, использующие движок хранения
InnoDB, не поддерживают внешние ключи. Дополнительную информацию см. в разделе 22.6, «Ограничения и пределы дробления». -
CHECKОператор
CHECKанализируется, но игнорируется всеми движками хранения. -
key_partСпецификация
key_partможет завершаться операторамиASCилиDESC. Эти ключевые слова разрешены для будущих расширений для указания возрастающего или убывающего хранения значений индекса. В настоящее время они анализируются, но игнорируются; значения индексов всегда хранятся в возрастающем порядке.-
Префиксы, определённые атрибутом
length, могут иметь длину до 767 байт для таблицInnoDBили 3072 байта, если включена опцияinnodb_large_prefix. Для таблицMyISAMпредел длины префикса составляет 1000 байт.Пределы префиксов измеряются в байтах. Однако длины префиксов для спецификаций индексов в выражениях
CREATE TABLE,ALTER TABLEиCREATE INDEXинтерпретируются как количество символов для типов строк без бинарного представления (CHAR,VARCHAR,TEXT) и количество байт для типов бинарных строк (BINARY,VARBINARY,BLOB). Учтите это, когда вы указываете длину префикса для столбца строки без бинарного представления, который использует многобайтовую кодировку символов.
-
index_typeНекоторые движки хранения позволяют указывать тип индекса при создании индекса. Синтаксис для спецификатора
index_type—USING.type_nameПример:
CREATE TABLE lookup (id INT, INDEX USING BTREE (id)) ENGINE = MEMORY;
Предпочтительное положение для
USING— после списка столбцов индекса. Его можно указать и перед списком столбцов, но поддержка этого варианта в таком положении устарела; ожидается его удаление в будущих выпусках MySQL. -
index_optionЗначения
index_optionзадают дополнительные параметры для индекса.-
KEY_BLOCK_SIZEДля таблиц
MyISAM,KEY_BLOCK_SIZEнеобязательно задает размер в байтах для блоков ключей индекса. Значение рассматривается как подсказка; может использоваться другой размер, если это необходимо. ЗначениеKEY_BLOCK_SIZE, указанное для отдельного определения индекса, переопределяет значениеKEY_BLOCK_SIZEна уровне таблицы.Сведения об атрибуте
KEY_BLOCK_SIZEна уровне таблицы см. в разделе Параметры таблицы. -
WITH PARSERПараметр
WITH PARSERможет использоваться только с индексамиFULLTEXT. Он связывает плагин анализатора с индексом, если для операций полнотекстового индексирования и поиска требуется специальная обработка. Поддержка плагинов анализатора полнотекста реализована как вInnoDB, так и вMyISAM. Если у вас есть таблицаMyISAMс ассоциированным плагином анализатора полнотекста, вы можете преобразовать таблицу вInnoDB, используяALTER TABLE. -
COMMENTОпределения индексов могут включать необязательный комментарий длиной до 1024 символов.
Вы можете установить значение
InnoDBMERGE_THRESHOLDдля отдельного индекса, используя предложениеindex_optionCOMMENT. См. Раздел 14.8.12, «Настройка порога слияния для страниц индексов».
Более подробную информацию о допустимых значениях
index_optionсм. в Разделе 13.1.14, «Оператор CREATE INDEX». Более подробную информацию об индексах см. в Разделе 8.3.1, «Как MySQL использует индексы». -
-
reference_definitionПодробности синтаксиса
reference_definitionи примеры см. в Разделе 13.1.18.5, «Ограничения FOREIGN KEY».Таблицы
InnoDBиNDBподдерживают проверку ограничений внешнего ключа. Столбцы таблицы-получателя всегда должны быть явно указаны. Поддерживаются какON DELETE, так иON UPDATEдействия с внешними ключами. Более подробную информацию и примеры см. в Разделе 13.1.18.5, «Ограничения FOREIGN KEY».Для других движков хранения сервер MySQL анализирует и игнорирует синтаксис
FOREIGN KEYв операторахCREATE TABLE.ВажноДля пользователей, знакомых со стандартом ANSI/ISO SQL, обратите внимание, что ни один движок хранения, включая
InnoDB, не распознает или не применяет предложениеMATCH, используемое в определениях ограничений целостности ссылок. Использование явного предложенияMATCHне имеет указанного эффекта и также приводит к игнорированию предложенийON DELETEиON UPDATE. По этим причинам следует избегать указанияMATCH.Предложение
MATCHв SQL-стандарте управляет тем, как обрабатываются значенияNULLв составном (многостолбцовом) внешнем ключе при сравнении с первичным ключом.InnoDBпо существу реализует семантику, определеннуюMATCH SIMPLE, которая позволяет внешнему ключу быть полностью или частичноNULL. В этом случае строка (дочерней таблицы), содержащая такой внешний ключ, может быть вставлена и не совпадает ни с одной строкой в таблице-получателе (родительской таблице). Реализацию других семантик можно осуществить с помощью триггеров.Кроме того, MySQL требует, чтобы столбцы-получатели были проиндексированы для повышения производительности. Однако
InnoDBне налагает никаких требований к тому, чтобы столбцы-получатели были объявленыUNIQUEилиNOT NULL. Обработка ссылок внешнего ключа на неуникальные ключи или ключи, содержащиеNULLзначения, не определена для таких операций, какUPDATEилиDELETE CASCADE. Рекомендуется использовать внешние ключи, ссылающиеся только на ключи, которые являются одновременноUNIQUE(илиPRIMARY) иNOT NULL.MySQL анализирует, но игнорирует “встроенные
REFERENCESспецификации” (как определено в SQL-стандарте), где ссылки определяются как часть спецификации столбца. MySQL принимает предложенияREFERENCESтолько при указании в отдельной спецификацииFOREIGN KEY. Более подробную информацию см. в Разделе 1.6.2.3, «Отличия в ограничениях FOREIGN KEY». -
reference_optionСведения об опциях
RESTRICT,CASCADE,SET NULL,NO ACTIONиSET DEFAULTсм. в Разделе 13.1.18.5, «Ограничения FOREIGN KEY».
Параметры таблицы
Параметры таблицы используются для оптимизации поведения таблицы. В большинстве случаев их указывать не нужно. Эти параметры применяются ко всем движкам хранения, если не указано иное. Параметры, которые не применяются к данному движку хранения, могут приниматься и сохраняться как часть определения таблицы. Такие параметры затем применяются, если вы позже используете ALTER TABLE для преобразования таблицы с использованием другого движка хранения.
-
ENGINEУказывает движок хранения для таблицы, используя одно из названий, показанных в следующей таблице. Имя движка может быть не заключено в кавычки или заключено в кавычки. Цитатное имя
'DEFAULT'распознается, но игнорируется.Движок хранения Описание InnoDBТранзакционно-безопасные таблицы с блокировкой строк и внешними ключами. По умолчанию, движок хранения для новых таблиц. См. Главу 14, Движок хранения InnoDB, а в частности Раздел 14.1, «Введение в InnoDB», если у вас есть опыт работы с MySQL, но вы новичок в InnoDB.MyISAMДвоичный переносимый движок хранения, который в основном используется для нагрузок с преимущественно чтением или только для чтения. См. Раздел 15.2, «Движок хранения MyISAM». MEMORYДанные для этого движка хранения хранятся только в памяти. См. Раздел 15.3, «Движок хранения MEMORY». CSVТаблицы, которые хранят строки в формате CSV. См. Раздел 15.4, «Движок хранения CSV». ARCHIVEДвижок хранения для архивирования. См. Раздел 15.5, «Движок хранения ARCHIVE». EXAMPLEПример движка. См. Раздел 15.9, «Движок хранения EXAMPLE». FEDERATEDДвижок хранения, который обращается к удалённым таблицам. См. Раздел 15.8, «Движок хранения FEDERATED». HEAPЭто синоним для MEMORY.MERGEКоллекция MyISAMтаблиц, используемых как одна таблица. Также известна какMRG_MyISAM. См. Раздел 15.7, «Движок хранения MERGE».NDBКластеризованные, отказоустойчивые, основанные на памяти таблицы, поддерживающие транзакции и внешние ключи. Также известные как NDBCLUSTER. См. Главу 21, MySQL NDB Cluster 7.5 и NDB Cluster 7.6.По умолчанию, если указан движок хранения, который недоступен, операция завершается с ошибкой. Вы можете изменить это поведение, удалив
NO_ENGINE_SUBSTITUTIONиз режима SQL сервера (см. Раздел 5.1.10, «Режимы SQL сервера»), чтобы MySQL позволил заменить указанный движок на движок хранения по умолчанию. Обычно в таких случаях этоInnoDB, что является значением по умолчанию дляdefault_storage_engineсистемной переменной. КогдаNO_ENGINE_SUBSTITUTIONотключен, появляется предупреждение, если спецификация движка хранения не выполняется. -
AUTO_INCREMENTНачальное
AUTO_INCREMENTзначение для таблицы. В MySQL 5.7 это работает дляMyISAM,MEMORY,InnoDBиARCHIVEтаблиц. Чтобы установить первое значение автоинкремента для движков, которые не поддерживаютAUTO_INCREMENTпараметр таблицы, вставьте строку “dummy” со значением на единицу меньше желаемого значения после создания таблицы, а затем удалите эту строку.Для движков, которые поддерживают
AUTO_INCREMENTпараметр таблицы в операторахCREATE TABLE, вы также можете использоватьALTER TABLEдля сбросаtbl_nameAUTO_INCREMENT =NAUTO_INCREMENTзначения. Значение не может быть установлено ниже максимального значения, которое в настоящее время находится в столбце. -
AVG_ROW_LENGTHПриблизительная средняя длина строки для вашей таблицы. Вам необходимо установить это только для больших таблиц с переменной длиной строк.
При создании
MyISAMтаблицы MySQL использует произведение параметровMAX_ROWSиAVG_ROW_LENGTH, чтобы определить размер получившейся таблицы. Если ни один из параметров не указан, по умолчанию максимальный размер файлов данных и индексов таблицы составляет 256 ТБ. (Если ваша операционная система не поддерживает файлы такого размера, размеры таблиц ограничены пределом размера файла). Если вы хотите уменьшить размер указателей, чтобы индекс был меньше и быстрее, а вам не нужны большие файлы, вы можете уменьшить размер указателя по умолчанию, установив системную переменнуюmyisam_data_pointer_size. (См. Раздел 5.1.7, «Системные переменные сервера»). Если вы хотите, чтобы все ваши таблицы могли расти сверх значения по умолчанию и готовы к тому, что ваши таблицы будут немного медленнее и больше, чем необходимо, вы можете увеличить размер указателя по умолчанию, установив эту переменную. Установка значения в 7 позволяет размещать таблицы размером до 65 536 ТБ. -
[DEFAULT] CHARACTER SETУказывает набор символов по умолчанию для таблицы.
CHARSET— синоним дляCHARACTER SET. Если имя набора символов —DEFAULT, используется набор символов базы данных. -
CHECKSUMУстановите это значение в 1, если вы хотите, чтобы MySQL поддерживал активную контрольную сумму для всех строк (то есть контрольную сумму, которую MySQL обновляет автоматически по мере изменения таблицы). Это немного замедляет обновление таблицы, но также упрощает поиск повреждённых таблиц. Оператор
CHECKSUM TABLEсообщает контрольную сумму. (MyISAMтолько.) -
[DEFAULT] COLLATEУказывает кодировку по умолчанию для таблицы.
-
COMMENTКомментарий к таблице, длиной до 2048 символов.
Вы можете установить
InnoDBMERGE_THRESHOLDзначение для таблицы, используя предложениеtable_optionCOMMENT. См. Раздел 14.8.12, «Настройка порога слияния для страниц индекса».Установка параметров NDB_TABLE. В MySQL NDB Cluster 7.5.2 и более поздних версиях комментарий к таблице в операторе
CREATE TABLEилиALTER TABLEтакже можно использовать для указания одного-четырёх параметровNDB_TABLENOLOGGING,READ_BACKUP,PARTITION_BALANCEилиFULLY_REPLICATEDв виде набора пар имя-значение, разделённых запятыми при необходимости, непосредственно после строкиNDB_TABLE=, начинающей цитируемый текст комментария. Вот пример оператора с использованием этого синтаксиса (выделенный текст):CREATE TABLE t1 ( c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, c2 VARCHAR(100), c3 VARCHAR(100) ) ENGINE=NDB COMMENT="NDB_TABLE=READ_BACKUP=0,PARTITION_BALANCE=FOR_RP_BY_NODE";Пробелы в цитируемой строке запрещены. Строка регистронезависима.
Комментарий отображается как часть вывода
SHOW CREATE TABLE. Текст комментария также доступен в качестве столбца TABLE_COMMENT схемы MySQL Information SchemaTABLES.Этот синтаксис комментария также поддерживается операторами
ALTER TABLEдляNDBтаблиц. Имейте в виду, что комментарий к таблице, используемый сALTER TABLE, заменяет любой существующий комментарий, который таблица могла иметь ранее.Установка параметра
MERGE_THRESHOLDв комментариях к таблицам не поддерживается для таблицNDB(он игнорируется).Для получения полной информации о синтаксисе и примеров см. Раздел 13.1.18.9, «Настройка параметров комментариев NDB».
-
COMPRESSIONАлгоритм сжатия, используемый для сжатия страниц на уровне страниц для
InnoDBтаблиц. Поддерживаемые значения включаютZlib,LZ4иNone. АтрибутCOMPRESSIONбыл введён с функцией прозрачного сжатия страниц. Сжатие страниц поддерживается только дляInnoDBтаблиц, которые находятся в табличном пространстве, и доступно только на платформах Linux и Windows, поддерживающих разряженные файлы и «дыроколы». Для получения дополнительной информации см. Раздел 14.9.2, «Сжатие страниц InnoDB». -
CONNECTIONСтрока подключения для
FEDERATEDтаблицы.ПримечаниеБолее ранние версии MySQL использовали параметр
COMMENTдля строки подключения.
-
DATA DIRECTORY,INDEX DIRECTORYДля
InnoDB, клаузулаDATA DIRECTORY='позволяет создать таблицу вне каталога данных. Переменнаяdirectory'innodb_file_per_tableдолжна быть включена для использования клаузулыDATA DIRECTORY. Полный путь к каталогу должен быть указан. Для получения дополнительной информации см. Раздел 14.6.1.2, «Создание таблиц вне каталога данных».При создании таблиц
MyISAM, вы можете использовать клаузулуDATA DIRECTORY=', клаузулуdirectory'INDEX DIRECTORY='или обе. Они указывают, где разместить файл данных и файл индексов таблицыdirectory'MyISAMсоответственно. В отличие от таблицInnoDB, MySQL не создает подкаталоги, соответствующие имени базы данных, при создании таблицыMyISAMс опциямиDATA DIRECTORYилиINDEX DIRECTORY. Файлы создаются в указанном каталоге.Начиная с MySQL 5.7.17, для использования опции таблицы
DATA DIRECTORYилиINDEX DIRECTORYнеобходимо иметь привилегиюFILE.ВажноОпции уровня таблицы
DATA DIRECTORYиINDEX DIRECTORYигнорируются для разнесённых таблиц. (Ошибка #32091)Эти опции работают только при отсутствии опции
--skip-symbolic-links. Ваша операционная система также должна иметь работоспособную, потокобезопасную функциюrealpath(). Дополнительная информация содержится в Разделе 8.12.3.2, «Использование символических ссылок для таблиц MyISAM в Unix».Если таблица
MyISAMсоздаётся без опцииDATA DIRECTORY, файл.MYDсоздаётся в каталоге базы данных. По умолчанию, еслиMyISAMобнаруживает существующий файл.MYDв этом случае, он перезаписывается. То же самое относится к файлам.MYIдля таблиц, созданных без опцииINDEX DIRECTORY. Для подавления этого поведения запустите сервер с опцией--keep_files_on_create, в этом случаеMyISAMне перезаписывает существующие файлы и вместо этого возвращает ошибку.Если таблица
MyISAMсоздаётся с опциейDATA DIRECTORYилиINDEX DIRECTORYи обнаруживается существующий файл.MYDили.MYI, MyISAM всегда возвращает ошибку. Он не перезаписывает файл в указанном каталоге.ВажноВы не можете использовать пути, содержащие каталог данных MySQL с
DATA DIRECTORYилиINDEX DIRECTORY. Это относится и к разнесённым таблицам, и к отдельным разнесённым частям таблиц. (См. ошибку #32167.) -
DELAY_KEY_WRITEУстановите это значение в 1, если хотите отложить обновление ключей для таблицы до закрытия таблицы. См. описание системной переменной
delay_key_writeв Разделе 5.1.7, «Системные переменные сервера». (MyISAMтолько.) -
ENCRYPTIONУстановите опцию
ENCRYPTIONв значение'Y', чтобы включить шифрование данных на уровне страницы для таблицыInnoDB, созданной в табличном пространстве. Значения опций не зависят от регистра. ОпцияENCRYPTIONбыла представлена с функцией шифрования табличного пространстваInnoDB; см. Раздел 14.14, «Шифрование данных InnoDB». Плагинkeyringдолжен быть установлен и настроен перед включением шифрования.Опция
ENCRYPTIONподдерживается только хранилищемInnoDB; поэтому она работает только в том случае, если хранилище по умолчанию являетсяInnoDB, или если инструкцияCREATE TABLEтакже задаётENGINE=InnoDB. В противном случае предложение отклоняется с . -
INSERT_METHODЕсли вы хотите вставить данные в таблицу
MERGE, вы должны указать с помощьюINSERT_METHODтаблицу, в которую должна быть вставлена строка.INSERT_METHOD— это опция, полезная только для таблицMERGE. Используйте значениеFIRSTилиLASTдля вставки в первую или последнюю таблицу или значениеNOдля предотвращения вставки. См. Раздел 15.7, «Хранилище MERGE». -
KEY_BLOCK_SIZEДля таблиц
MyISAM,KEY_BLOCK_SIZEнеобязательно задаёт размер в байтах для использования блоков ключа индекса. Значение обрабатывается как подсказка; при необходимости может использоваться другой размер. ЗначениеKEY_BLOCK_SIZE, указанное для отдельного определения индекса, переопределяет значениеKEY_BLOCK_SIZEна уровне таблицы.Для таблиц
InnoDB,KEY_BLOCK_SIZEзадаёт размер в килобайтах для использованияInnoDBтаблиц. ЗначениеKEY_BLOCK_SIZEобрабатывается как подсказка;InnoDBможет использовать другой размер, если необходимо. ЗначениеKEY_BLOCK_SIZEможет быть только меньше или равно значениюinnodb_page_size. Значение 0 представляет размер страницы сжатия по умолчанию, что составляет половину значенияinnodb_page_size. В зависимости отinnodb_page_size, возможные значенияKEY_BLOCK_SIZEвключают 0, 1, 2, 4, 8 и 16. Более подробная информация приведена в Разделе 14.9.1, «Сжатие таблиц InnoDB».Oracle рекомендует включить
innodb_strict_modeпри указанииKEY_BLOCK_SIZEдляInnoDBтаблиц. Когдаinnodb_strict_modeвключена, указание недопустимого значенияKEY_BLOCK_SIZEвозвращает ошибку. Еслиinnodb_strict_modeотключена, недопустимое значениеKEY_BLOCK_SIZEприводит к предупреждению, и опцияKEY_BLOCK_SIZEигнорируется.Столбец
Create_optionsв ответ наSHOW TABLE STATUSотчитывается об изначально указанной опцииKEY_BLOCK_SIZE, как иSHOW CREATE TABLE.InnoDBподдерживаетKEY_BLOCK_SIZEтолько на уровне таблицы.KEY_BLOCK_SIZEне поддерживается со значениямиinnodb_page_size32 КБ и 64 КБ.InnoDBсжатие таблиц не поддерживает эти размеры страниц. -
MAX_ROWSМаксимальное количество строк, которое вы планируете хранить в таблице. Это не жёсткое ограничение, а подсказка для хранилища, что таблица должна иметь возможность хранить как минимум такое количество строк.
ВажноИспользование
MAX_ROWSс таблицамиNDBдля управления количеством разделов таблицы устарело, начиная с NDB Cluster 7.5.4. Оно всё ещё поддерживается в более поздних версиях для обратной совместимости, но может быть удалено в будущих релизах. Используйте PARTITION_BALANCE вместо этого; см. Настройка параметров NDB_TABLE.Хранилище
NDBобрабатывает это значение как максимальное. Если вы планируете создавать очень большие таблицы NDB Cluster (содержащие миллионы строк), вы должны использовать эту опцию, чтобы убедиться, чтоNDBвыделяет достаточное количество слотов индекса в хэш-таблице, используемой для хранения хэшей первичных ключей таблицы, установивMAX_ROWS = 2 *, гдеrowsrows— это количество строк, которые вы ожидаете вставить в таблицу.Максимальное значение
MAX_ROWS— 4294967295; значения больше этого будут усечены до этого предела. -
MIN_ROWSМинимальное количество строк, которые вы планируете хранить в таблице. Хранилище
MEMORYиспользует эту опцию как подсказку о потреблении памяти.
-
PACK_KEYSДействует только с таблицами
MyISAM. Установите это значение в 1, если хотите иметь меньшие индексы. Обычно это замедляет обновления и ускоряет чтение. Установка значения в 0 отключает всю упаковку ключей. Установка в значениеDEFAULTсообщает хранилищу данных о том, что необходимо упаковать только длинные столбцыCHAR,VARCHAR,BINARYилиVARBINARY.Если вы не используете
PACK_KEYS, по умолчанию строки упаковываются, но не числа. Если вы используетеPACK_KEYS=1, числа также упаковываются.При упаковке двоичных числовых ключей MySQL использует сжатие префикса:
Каждый ключ требует одного дополнительного байта для указания того, сколько байтов предыдущего ключа совпадают со следующим ключом.
Указатель на строку хранится в старшем байте непосредственно после ключа для улучшения сжатия.
Это означает, что если у вас много одинаковых ключей в двух последовательных строках, все последующие “одинаковые” ключи обычно занимают всего два байта (включая указатель на строку). Сравните это со стандартным случаем, когда последующие ключи занимают
storage_size_for_key + pointer_size(где размер указателя обычно равен 4). Напротив, значительная выгода от сжатия префикса достигается только при наличии множества одинаковых чисел. Если все ключи совершенно разные, вы используете на один байт больше на ключ, если ключ не может иметьNULLзначения. (В этом случае длина упакованного ключа хранится в том же байте, который используется для обозначения того, является ли ключNULL.) -
PASSWORDЭтот параметр не используется. Если вам нужно зашифровать файлы
.frmи сделать их непригодными для использования другим сервером MySQL, свяжитесь с отделом продаж. -
ROW_FORMATОпределяет физический формат, в котором хранятся строки.
При создании таблицы со значением, равным disabled, используется форма строки по умолчанию хранилища данных, если указанный формат строки не поддерживается. Фактический формат строки таблицы отображается в столбце
Row_formatв ответ наSHOW TABLE STATUS. СтолбецCreate_optionsотображает формат строки, указанный вCREATE TABLEзаявлении, как иSHOW CREATE TABLE.Выбор форматов строк отличается в зависимости от используемого хранилища данных для таблицы.
Для таблиц
InnoDB:-
Формат строки по умолчанию определяется
innodb_default_row_format, который имеет значение по умолчаниюDYNAMIC. Формат строки по умолчанию используется, когда параметрROW_FORMATне определен или используетсяROW_FORMAT=DEFAULT.Если параметр
ROW_FORMATне определен или используетсяROW_FORMAT=DEFAULT, операции, которые перестраивают таблицу, также безвозвратно изменяют формат строки таблицы на значение по умолчанию, определенноеinnodb_default_row_format. Дополнительную информацию см. в разделе Определение формата строк таблицы. Для более эффективного
InnoDBхранения типов данных, особенно типовBLOB, используйтеDYNAMIC. Требования к формату строкиDYNAMICсм. в разделе DYNAMIC Формат строк.Чтобы включить сжатие для таблиц
InnoDB, укажитеROW_FORMAT=COMPRESSED. Требования к формату строкиCOMPRESSEDсм. в разделе Раздел 14.9, «Сжатие таблиц и страниц InnoDB».Формат строки, используемый в более ранних версиях MySQL, по-прежнему может быть запрошен путем указания формата строки
REDUNDANT.При указании нестандартного
ROW_FORMATусловия также рассмотрите возможность включения параметра конфигурацииinnodb_strict_mode.ROW_FORMAT=FIXEDне поддерживается. ЕслиROW_FORMAT=FIXEDуказан при отключенной настройкеinnodb_strict_mode,InnoDBвыводит предупреждение и предполагаетROW_FORMAT=DYNAMIC. ЕслиROW_FORMAT=FIXEDуказан при включенной настройкеinnodb_strict_mode, что является значением по умолчанию,InnoDBвозвращает ошибку.Дополнительную информацию о форматах строк
InnoDBсм. в Разделе 14.11, «Форматы строк InnoDB».
Для таблиц
MyISAMзначение параметра может бытьFIXEDилиDYNAMICдля статического или переменного формата строк. myisampack устанавливает тип вCOMPRESSED. См. Раздел 15.2.3, «Форматы хранения таблиц MyISAM».Для таблиц
NDBзначение по умолчаниюROW_FORMATв MySQL NDB Cluster 7.5.1 и более поздних версиях равноDYNAMIC. (Ранее оно былоFIXED.) -
-
STATS_AUTO_RECALCУказывает, нужно ли автоматически пересчитывать для таблицы
InnoDB. ЗначениеDEFAULTприводит к тому, что постоянные параметры статистики для таблицы определяются параметром конфигурацииinnodb_stats_auto_recalc. Значение1приводит к пересчету статистики, когда 10% данных в таблице изменились. Значение0предотвращает автоматический пересчет для этой таблицы; с этим значением необходимо выполнить операциюANALYZE TABLEдля пересчета статистики после существенных изменений в таблице. Дополнительную информацию об особенностях постоянной статистики см. в Разделе 14.8.11.1, «Настройка параметров постоянных параметров оптимизатора». -
STATS_PERSISTENTУказывает, следует ли включить для таблицы
InnoDB. ЗначениеDEFAULTприводит к тому, что постоянные параметры статистики для таблицы определяются параметром конфигурацииinnodb_stats_persistent. Значение1включает постоянную статистику для таблицы, а значение0отключает эту функцию. После включения постоянной статистики с помощью операторовCREATE TABLEилиALTER TABLEвыполните операциюANALYZE TABLEдля расчета статистики после загрузки репрезентативных данных в таблицу. Дополнительную информацию об особенностях постоянной статистики см. в Разделе 14.8.11.1, «Настройка параметров постоянных параметров оптимизатора». -
STATS_SAMPLE_PAGESКоличество страниц индекса, которые нужно проанализировать при оценке кардинальности и других статистических данных для индексированного столбца, таких как те, которые рассчитываются операцией
ANALYZE TABLE. Дополнительную информацию см. в Разделе 14.8.11.1, «Настройка параметров постоянных параметров оптимизатора».
-
TABLESPACEОператор
TABLESPACEможно использовать для создания таблицы InnoDB в существующем общем табличном пространстве, табличном пространстве с файлом на таблицу или системном табличном пространстве.CREATE TABLE
tbl_name... TABLESPACE [=]tablespace_nameУказанное вами общее табличное пространство должно существовать до использования оператора
TABLESPACE. Сведения об общих табличных пространствах см. в разделе 14.6.3.3, «Общие табличные пространства».— это чувствительный к регистру идентификатор. Он может быть заключён в кавычки или без них. Символ косой черты (“/”) запрещён. Имена, начинающиеся с “innodb_”, зарезервированы для специального использования.tablespace_nameДля создания таблицы в системном табличном пространстве укажите
innodb_systemв качестве имени табличного пространства.CREATE TABLE
tbl_name... TABLESPACE [=] innodb_systemС помощью
TABLESPACE [=] innodb_systemвы можете разместить таблицу с любым нескомпрессированным форматом строк в системном табличном пространстве независимо от параметраinnodb_file_per_table. Например, вы можете добавить таблицу сROW_FORMAT=DYNAMICв системное табличное пространство с помощьюTABLESPACE [=] innodb_system.Для создания таблицы в табличном пространстве с файлом на таблицу укажите
innodb_file_per_tableв качестве имени табличного пространства.CREATE TABLE
tbl_name... TABLESPACE [=] innodb_file_per_tableПримечаниеЕсли
innodb_file_per_tableвключено, вам не нужно указыватьTABLESPACE=innodb_file_per_tableдля создания табличного пространства с файлом на таблицуInnoDB. ТаблицыInnoDBсоздаются в табличных пространствах с файлом на таблицу по умолчанию, когдаinnodb_file_per_tableвключено.ПримечаниеПоддержка создания раздела таблицы в общих табличных пространствах
InnoDBустарела в MySQL 5.7.24; ожидается её удаление в будущих версиях MySQL. Общие табличные пространства включают системное табличное пространствоInnoDBи общие табличные пространства.Оператор
DATA DIRECTORYразрешён сCREATE TABLE ... TABLESPACE=innodb_file_per_table, но в противном случае не поддерживается в сочетании с опциейTABLESPACE.ПримечаниеПоддержка операторов
TABLESPACE = innodb_file_per_tableиTABLESPACE = innodb_temporaryсCREATE TEMPORARY TABLEустарела начиная с MySQL 5.7.24; ожидается её удаление в будущих версиях MySQL.Опция таблицы
STORAGEиспользуется только с таблицамиNDB.STORAGEопределяет тип используемого хранилища и может быть либоDISK, либоMEMORY.TABLESPACE ... STORAGE DISKназначает таблицу табличному пространству данных диска NDB Cluster.STORAGE DISKнельзя использовать вCREATE TABLE, если ему не предшествуетTABLESPACEtablespace_name.Для
STORAGE MEMORYимя табличного пространства является необязательным, поэтому вы можете использоватьTABLESPACEили простоtablespace_nameSTORAGE MEMORYSTORAGE MEMORY, чтобы явно указать, что таблица находится в оперативной памяти.Дополнительную информацию см. в разделе 21.6.11, «NDB Cluster Disk Data Tables».
-
Используется для доступа к набору идентичных
MyISAMтаблиц как к одной. Это работает только с таблицамиMERGE. См. раздел 15.7, «Двигатель MERGE».Для таблиц, которые вы отображаете на
MERGEтаблице, необходимо иметь праваSELECT,UPDATEиDELETE.ПримечаниеРаньше все используемые таблицы должны были находиться в одной базе данных, что и сама
MERGEтаблица. Это ограничение больше не действует.
Разбиение таблиц
partition_options может использоваться для управления разбиением таблицы, созданной с помощью CREATE TABLE.
Не все опции, показанные в синтаксисе для partition_options в начале этого раздела, доступны для всех типов разбиения. Для получения информации, специфичной для каждого типа, обратитесь к спискам соответствующих типов и к главе 22, «Разбиение», где представлена более подробная информация о работе с разбиением в MySQL, а также дополнительные примеры создания таблиц и других операторов, связанных с разбиением MySQL.
Разделы таблиц могут быть изменены, объединены, добавлены к таблицам и удалены из них. Для получения общей информации об операторах MySQL для выполнения этих задач, см. раздел 13.1.8, «Оператор ALTER TABLE». Более подробные описания и примеры см. в разделе 22.3, «Управление разбиением».
-
PARTITION BYЕсли используется, предложение
partition_optionsначинается сPARTITION BY. Это предложение содержит функцию, используемую для определения раздела; функция возвращает целое число от 1 доnum, гдеnum— число разделов. (Максимальное число определяемых пользователем разделов, которые может содержать таблица, равно 1024; количество подразделов — обсуждается позже в этом разделе — включено в это максимальное значение.)ПримечаниеВыражение (
expr), используемое в предложенииPARTITION BY, не может ссылаться на столбцы, не входящие в создаваемую таблицу; такие ссылки запрещены и приводят к завершению оператора с ошибкой. (Ошибка #29444) -
HASH(expr)Хэширует один или несколько столбцов для создания ключа размещения и поиска строк.
expr— это выражение, использующее один или несколько столбцов таблицы. Это может быть любое допустимое выражение MySQL (включая функции MySQL), которое возвращает единственное целое значение. Например, оба этих оператораCREATE TABLEиспользуютPARTITION BY HASH:CREATE TABLE t1 (col1 INT, col2 CHAR(5)) PARTITION BY HASH(col1); CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATETIME) PARTITION BY HASH ( YEAR(col3) );Вы не можете использовать ни предложения
VALUES LESS THAN, ниVALUES INсPARTITION BY HASH.PARTITION BY HASHиспользует остаток от деленияexprна число разделов (то есть, модуль). Примеры и дополнительную информацию см. в разделе 22.2.4, «HASH Partitioning».Ключевое слово
LINEARподразумевает несколько иной алгоритм. В этом случае номер раздела, в котором хранится строка, рассчитывается как результат одной или нескольких логическихANDопераций. Обсуждение и примеры линейного хэширования см. в разделе 22.2.4.1, «LINEAR HASH Partitioning». -
KEY(column_list)Это аналогично
HASH, за исключением того, что MySQL предоставляет функцию хэширования, чтобы гарантировать равномерное распределение данных. Аргументcolumn_list— это просто список из 1 или более столбцов таблицы (максимум: 16). Этот пример показывает простую таблицу, разделенную по ключу, с 4 разделами:CREATE TABLE tk (col1 INT, col2 CHAR(5), col3 DATE) PARTITION BY KEY(col3) PARTITIONS 4;Для таблиц, разделенных по ключу, вы можете использовать линейное разбиение, используя ключевое слово
LINEAR. Это имеет тот же эффект, что и для таблиц, разделенных поHASH. То есть номер раздела находится с использованием оператора&, а не модуля (см. раздел 22.2.4.1, «LINEAR HASH Partitioning» и раздел 22.2.5, «KEY Partitioning» для получения подробностей). В этом примере используется линейное разбиение по ключу для распределения данных между 5 разделами:CREATE TABLE tk (col1 INT, col2 CHAR(5), col3 DATE) PARTITION BY LINEAR KEY(col3) PARTITIONS 5;Опция
ALGORITHM={1 | 2}поддерживается с[SUB]PARTITION BY [LINEAR] KEY.ALGORITHM=1заставляет сервер использовать те же функции хэширования ключей, что и MySQL 5.1;ALGORITHM=2означает, что сервер использует функции хэширования ключей, используемые по умолчанию для новых таблиц с разбиением поKEYв MySQL 5.7 и более поздних версиях. Если опция не указана, это эквивалентно использованиюALGORITHM=2. Эта опция предназначена в основном для модернизации таблиц с разбиением по[LINEAR] KEYс MySQL 5.1 до более поздних версий MySQL. Дополнительную информацию см. в разделе 13.1.8.1, «ALTER TABLE Partition Operations».mysqldump записывает эту опцию в версионированных комментариях, например так:
CREATE TABLE t1 (a INT) /*!50100 PARTITION BY KEY */ /*!50611 ALGORITHM = 1 */ /*!50100 () PARTITIONS 3 */Это заставляет серверы MySQL 5.6.10 и более ранних версий игнорировать опцию, которая в противном случае привела бы к синтаксической ошибке в этих версиях.
ALGORITHM=1отображается при необходимости в выводеSHOW CREATE TABLEс использованием версионированных комментариев аналогичным образом, как и для mysqldump.ALGORITHM=2всегда опускается из выводаSHOW CREATE TABLE, даже если эта опция была указана при создании исходной таблицы.Вы не можете использовать ни предложения
VALUES LESS THAN, ниVALUES INсPARTITION BY KEY. -
RANGE(expr)В этом случае
exprпоказывает диапазон значений, используя наборVALUES LESS THANоператоров. При использовании разбиения по диапазонам вы должны определить хотя бы один раздел с помощьюVALUES LESS THAN. Вы не можете использоватьVALUES INс разбиением по диапазонам.ПримечаниеДля таблиц, разделяемых по
RANGE,VALUES LESS THANнеобходимо использовать либо целочисленное значение, либо выражение, вычисляющее единственное целочисленное значение. В MySQL 5.7 вы можете обойти это ограничение в таблице, определенной с помощьюPARTITION BY RANGE COLUMNS, как описано позже в этом разделе.Предположим, что у вас есть таблица, которую вы хотите разделить по столбцу, содержащему значения года, в соответствии со следующей схемой.
Номер раздела: Диапазон лет: 0 1990 и ранее 1 1991 по 1994 2 1995 по 1998 3 1999 по 2002 4 2003 по 2005 5 2006 и позже Таблица, реализующая такую схему разбиения, может быть создана оператором
CREATE TABLE, показанным здесь:CREATE TABLE t1 ( year_col INT, some_data INT ) PARTITION BY RANGE (year_col) ( PARTITION p0 VALUES LESS THAN (1991), PARTITION p1 VALUES LESS THAN (1995), PARTITION p2 VALUES LESS THAN (1999), PARTITION p3 VALUES LESS THAN (2002), PARTITION p4 VALUES LESS THAN (2006), PARTITION p5 VALUES LESS THAN MAXVALUE );Операторы
PARTITION ... VALUES LESS THAN ...работают последовательно.VALUES LESS THAN MAXVALUEиспользуется для указания «оставшихся» значений, которые больше максимального значения, указанного в противном случае.Предложения
VALUES LESS THANработают последовательно, аналогично фрагментамcaseблокаswitch ... case(как это встречается во многих языках программирования, таких как C, Java и PHP). То есть, предложения должны быть расположены таким образом, чтобы верхняя граница, указанная в каждом последующемVALUES LESS THAN, была больше, чем предыдущая, при этом предложение, ссылающееся наMAXVALUE, должно стоять последним в списке. -
RANGE COLUMNS(column_list)Этот вариант
RANGEоблегчает обрезку разделов для запросов, использующих условия диапазона по нескольким столбцам (то есть, имеющих условия, такие какWHERE a = 1 AND b < 10илиWHERE a = 1 AND b = 10 AND c < 10). Это позволяет указать диапазоны значений в нескольких столбцах, используя список столбцов в предложенииCOLUMNSи набор значений столбцов в каждом предложении определения разделаPARTITION ... VALUES LESS THAN (. (В простейшем случае этот набор состоит из одного столбца.) Максимальное число столбцов, которые можно сослаться вvalue_list)column_listиvalue_list, равно 16.column_list, используемое в предложенииCOLUMNS, может содержать только имена столбцов; каждый столбец в списке должен быть одним из следующих типов данных MySQL: целочисленные типы, строковые типы и типы столбцов времени или даты. Столбцы, использующиеBLOB,TEXT,SET,ENUM,BITили пространственные типы данных, запрещены; также запрещены столбцы, использующие типы чисел с плавающей точкой. Кроме того, в предложенииCOLUMNSнельзя использовать функции или арифметические выражения.Предложение
VALUES LESS THAN, используемое в определении раздела, должно указывать литеральное значение для каждого столбца, который появляется в предложенииCOLUMNS(); то есть, список значений, используемый для каждого предложенияVALUES LESS THAN, должен содержать такое же количество значений, как и столбцов, перечисленных в предложенииCOLUMNS. Попытка использовать больше или меньше значений в предложенииVALUES LESS THAN, чем столбцов в предложенииCOLUMNS, приводит к завершению оператора с ошибкой Несоответствие в использовании списков столбцов для разбиения.... Вы не можете использоватьNULLдля любого значения, появляющегося вVALUES LESS THAN. Возможна многократная ссылкаMAXVALUEдля столбца, отличного от первого, как показано в этом примере:CREATE TABLE rc ( a INT NOT NULL, b INT NOT NULL ) PARTITION BY RANGE COLUMNS(a,b) ( PARTITION p0 VALUES LESS THAN (10,5), PARTITION p1 VALUES LESS THAN (20,10), PARTITION p2 VALUES LESS THAN (50,MAXVALUE), PARTITION p3 VALUES LESS THAN (65,MAXVALUE), PARTITION p4 VALUES LESS THAN (MAXVALUE,MAXVALUE) );Каждое значение в списке значений
VALUES LESS THANдолжно точно соответствовать типу соответствующего столбца; преобразование не выполняется. Например, вы не можете использовать строку'1'для значения, соответствующего столбцу с целочисленным типом (нужно использовать число1), а также не можете использовать число1для значения, соответствующего столбцу со строковым типом (в таком случае необходимо использовать строку в кавычках:'1').Дополнительную информацию см. в разделе 22.2.1, «RANGE Partitioning» и разделе 22.4, «Partition Pruning».
-
LIST(expr)Это полезно при назначении разделов на основе столбца таблицы с ограниченным набором возможных значений, таких как код штата или страны. В таком случае все строки, относящиеся к определенному штату или стране, могут быть назначены одному разделу, или раздел может быть резервирован для определенного набора штатов или стран. Это похоже на
RANGE, за исключением того, что толькоVALUES INможет быть использовано для указания допустимых значений для каждого раздела.VALUES INиспользуется со списком значений для сопоставления. Например, вы можете создать схему разбиения, такую как следующая:CREATE TABLE client_firms ( id INT, name VARCHAR(35) ) PARTITION BY LIST (id) ( PARTITION r0 VALUES IN (1, 5, 9, 13, 17, 21), PARTITION r1 VALUES IN (2, 6, 10, 14, 18, 22), PARTITION r2 VALUES IN (3, 7, 11, 15, 19, 23), PARTITION r3 VALUES IN (4, 8, 12, 16, 20, 24) );При использовании разбиения по списку вы должны определить по крайней мере один раздел, используя
VALUES IN. Вы не можете использоватьVALUES LESS THANсPARTITION BY LIST.ПримечаниеДля таблиц, разделяемых по
LIST, список значений, используемых сVALUES IN, должен состоять только из целочисленных значений. В MySQL 5.7 вы можете преодолеть это ограничение, используя разбиение поLIST COLUMNS, которое описано позже в этом разделе. -
LIST COLUMNS(column_list)Этот вариант
LISTоблегчает обрезку разделов для запросов, использующих условия сравнения по нескольким столбцам (то есть имеющих такие условия, какWHERE a = 5 AND b = 5илиWHERE a = 1 AND b = 10 AND c = 5). Он позволяет указывать значения в нескольких столбцах, используя список столбцов в предложенииCOLUMNSи набор значений столбцов в каждом предложении определения разделаPARTITION ... VALUES IN (.value_list)Правила, регулирующие типы данных для списка столбцов, используемых в
LIST COLUMNS(, и списка значений, используемых вcolumn_list)VALUES IN(, такие же, как для списка столбцов, используемых вvalue_list)RANGE COLUMNS(, и списка значений, используемых вcolumn_list)VALUES LESS THAN(, за исключением того, что в предложенииvalue_list)VALUES INне допускаетсяMAXVALUE, и вы можете использоватьNULL.Существует одно важное различие между списком значений, используемых для
VALUES INсPARTITION BY LIST COLUMNS, по сравнению с использованием сPARTITION BY LIST. При использовании сPARTITION BY LIST COLUMNSкаждый элемент в предложенииVALUES INдолжен быть набором значений столбцов; количество значений в каждом наборе должно совпадать с количеством столбцов, используемых в предложенииCOLUMNS, а типы данных этих значений должны соответствовать типам данных столбцов (и появляться в том же порядке). В простейшем случае набор состоит из одного столбца. Максимальное количество столбцов, которое может быть использовано вcolumn_listи в элементах, составляющихvalue_list, равно 16.Таблица, определенная следующим предложением
CREATE TABLE, предоставляет пример таблицы с разбиением поLIST COLUMNS:CREATE TABLE lc ( a INT NULL, b INT NULL ) PARTITION BY LIST COLUMNS(a,b) ( PARTITION p0 VALUES IN( (0,0), (NULL,NULL) ), PARTITION p1 VALUES IN( (0,1), (0,2), (0,3), (1,1), (1,2) ), PARTITION p2 VALUES IN( (1,0), (2,0), (2,1), (3,0), (3,1) ), PARTITION p3 VALUES IN( (1,3), (2,2), (2,3), (3,2), (3,3) ) ); -
PARTITIONSnumКоличество разделов можно необязательно указать с помощью предложения
PARTITIONS, гдеnumnum— количество разделов. Если используется и это предложение и любые предложенияPARTITION,numдолжно быть равно общему количеству разделов, объявленных с помощью предложенийPARTITION.ПримечаниеИспользуете ли вы предложение
PARTITIONSпри создании таблицы, разделяемой поRANGEилиLIST, вам все равно необходимо включить по крайней мере одно предложениеPARTITION VALUESв определении таблицы (см. ниже). -
SUBPARTITION BYРаздел можно необязательно разделить на несколько подразделов. Это можно указать, используя необязательное предложение
SUBPARTITION BY. Подразделение может быть выполнено поHASHилиKEY. Любой из них может бытьLINEAR. Они работают так же, как и описано ранее для соответствующих типов разбиения. (Невозможно подразделить поLISTилиRANGE.)Количество подразделов можно указать с помощью ключевого слова
SUBPARTITIONS, за которым следует целочисленное значение. -
Строгое проверка значения, используемого в предложениях
PARTITIONSилиSUBPARTITIONS, применяется, и это значение должно соответствовать следующим правилам:Значение должно быть положительным, отличным от нуля целым числом.
Не допускаются ведущие нули.
Значение должно быть целочисленной константой и не может быть выражением. Например,
PARTITIONS 0.2E+01не допускается, даже если0.2E+01вычисляется как2. (Ошибка #15890)
-
partition_definitionКаждый раздел может быть индивидуально определен с помощью предложения
partition_definition. Отдельные части, составляющие это предложение, следующие:-
PARTITIONpartition_nameУказывает логическое имя раздела.
-
VALUESДля разбиения по диапазонам каждый раздел должен содержать предложение
VALUES LESS THAN; для разбиения по списку вы должны указать предложениеVALUES INдля каждого раздела. Это используется для определения строк, которые будут храниться в этом разделе. См. обсуждения типов разбиения в главе 22, Разбиение, для примеров синтаксиса. -
[STORAGE] ENGINEОбработчик разбиения принимает параметр
[STORAGE] ENGINEдляPARTITIONиSUBPARTITION. В настоящее время единственный способ его использования — это установить все разделы или все подразделы в один и тот же движок хранения, а попытка установить разные движки хранения для разделов или под-разделов в одной таблице приводит к ошибке Ошибка 1469 (HY000): Смешивание обработчиков в разделах недопустимо в этой версии MySQL. Мы ожидаем снять это ограничение на разбиение в будущих выпусках MySQL. -
COMMENTНеобязательное предложение
COMMENTможет быть использовано для указания строки, описывающей раздел. Пример:COMMENT = 'Data for the years previous to 1999'
Максимальная длина комментария к разделу составляет 1024 символа.
-
DATA DIRECTORYиINDEX DIRECTORYDATA DIRECTORYиINDEX DIRECTORYмогут быть использованы для указания каталога, в котором, соответственно, хранятся данные и индексы для данного раздела. И, иdata_dirдолжны быть абсолютными системными путями.index_dirНачиная с MySQL 5.7.17, для использования параметров разбиения
DATA DIRECTORYилиINDEX DIRECTORYтребуется привилегияFILE.Пример:
CREATE TABLE th (id INT, name VARCHAR(30), adate DATE) PARTITION BY LIST(YEAR(adate)) ( PARTITION p1999 VALUES IN (1995, 1999, 2003) DATA DIRECTORY = '/var/appdata/95/data' INDEX DIRECTORY = '/var/appdata/95/idx', PARTITION p2000 VALUES IN (1996, 2000, 2004) DATA DIRECTORY = '/var/appdata/96/data' INDEX DIRECTORY = '/var/appdata/96/idx', PARTITION p2001 VALUES IN (1997, 2001, 2005) DATA DIRECTORY = '/var/appdata/97/data' INDEX DIRECTORY = '/var/appdata/97/idx', PARTITION p2002 VALUES IN (1998, 2002, 2006) DATA DIRECTORY = '/var/appdata/98/data' INDEX DIRECTORY = '/var/appdata/98/idx' );DATA DIRECTORYиINDEX DIRECTORYведут себя так же, как в предложенииtable_optionоператораCREATE TABLEдля таблицMyISAM.Для каждого раздела можно указать один каталог данных и один каталог индексов. Если они не указаны, данные и индексы по умолчанию хранятся в каталоге базы данных таблицы.
В Windows параметры
DATA DIRECTORYиINDEX DIRECTORYне поддерживаются для отдельных разделов или под-разделов таблицMyISAMи параметрINDEX DIRECTORYне поддерживается для отдельных разделов или под-разделов таблицInnoDB. Эти параметры игнорируются в Windows, за исключением генерации предупреждения. (Ошибка #30459)ПримечаниеПараметры
DATA DIRECTORYиINDEX DIRECTORYигнорируются при создании разделяемых таблиц, еслиNO_DIR_IN_CREATEвключено. (Ошибка #24633) -
MAX_ROWSиMIN_ROWSМогут использоваться для указания, соответственно, максимального и минимального количества строк, хранящихся в разделе. Значения для
max_number_of_rowsиmin_number_of_rowsдолжны быть положительными целыми числами. Как и параметры таблицы с одинаковыми именами, они действуют только как «рекомендации» для сервера и не являются жёсткими ограничениями. -
TABLESPACEМожет использоваться для обозначения табличного пространства для раздела. Поддерживается NDB Cluster. Для таблиц
InnoDBон может быть использован для обозначения табличного пространства «файл на таблицу» для раздела, указавTABLESPACE `innodb_file_per_table`. Все разделы должны принадлежать одному движку хранения.ПримечаниеПоддержка размещения разделов таблиц
InnoDBв общих табличных пространствахInnoDBустарела в MySQL 5.7.24; ожидается, что она будет удалена в будущих версиях MySQL. Общие табличные пространства включают системное табличное пространствоInnoDBи общие табличные пространства.
-
-
subpartition_definitionОпределение разбиения может необязательно содержать одну или несколько
subpartition_definition-строк. Каждая из них содержит как минимумSUBPARTITION, гдеnamename— идентификатор подразбиения. За исключением замены ключевого словаPARTITIONнаSUBPARTITION, синтаксис определения подразбиения идентичен синтаксису определения разбиения.Подразбиение должно выполняться с помощью
HASHилиKEYи может выполняться только дляRANGEилиLISTразбиений. См. Раздел 22.2.6, «Подразбиение».
Разбиение по сгенерированным столбцам
Разбиение по сгенерированным столбцам разрешено. Например:
CREATE TABLE t1 (
s1 INT,
s2 INT AS (EXP(s1)) STORED
)
PARTITION BY LIST (s2) (
PARTITION p1 VALUES IN (1)
);
Разбиение рассматривает сгенерированный столбец как обычный столбец, что позволяет обойти ограничения функций, которые не разрешены для разбиения (см. Раздел 22.6.3, «Ограничения разбиения, связанные с функциями»). Приведенный пример демонстрирует эту технику: EXP() не может быть использовано непосредственно в PARTITION BY-строке, но разрешен сгенерированный столбец, определенный с использованием EXP().
© 2025 Oracle
Licensed under the GPLv2 License.