15.1.20 Оператор CREATE TABLE
- 15.1.20.1 Файлы, создаваемые оператором CREATE TABLE
- 15.1.20.2 Оператор CREATE TEMPORARY TABLE
- 15.1.20.3 Оператор CREATE TABLE ... LIKE
- 15.1.20.4 Оператор CREATE TABLE ... SELECT
- 15.1.20.5 Ограничения FOREIGN KEY
- 15.1.20.6 Ограничения CHECK
- 15.1.20.7 Неявные изменения спецификаций столбцов
- 15.1.20.8 CREATE TABLE и сгенерированные столбцы
- 15.1.20.9 Вторичные индексы и сгенерированные столбцы
- 15.1.20.10 Скрытые столбцы
- 15.1.20.11 Сгенерированные скрытые первичные ключи
- 15.1.20.12 Установка параметров комментариев 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_constraint_definition
}
column_definition: {
data_type [NOT NULL | NULL] [DEFAULT {literal | (expr)} ]
[VISIBLE | INVISIBLE]
[AUTO_INCREMENT] [UNIQUE [KEY]] [[PRIMARY] KEY]
[COMMENT 'string']
[COLLATE collation_name]
[COLUMN_FORMAT {FIXED | DYNAMIC | DEFAULT}]
[ENGINE_ATTRIBUTE [=] 'string']
[SECONDARY_ENGINE_ATTRIBUTE [=] 'string']
[STORAGE {DISK | MEMORY}]
[reference_definition]
[check_constraint_definition]
| data_type
[COLLATE collation_name]
[GENERATED ALWAYS] AS (expr)
[VIRTUAL | STORED] [NOT NULL | NULL]
[VISIBLE | INVISIBLE]
[UNIQUE [KEY]] [[PRIMARY] KEY]
[COMMENT 'string']
[reference_definition]
[check_constraint_definition]
}
data_type:
(see Chapter 13, Data Types)
key_part: {col_name [(length)] | (expr)} [ASC | DESC]
index_type:
USING {BTREE | HASH}
index_option: {
KEY_BLOCK_SIZE [=] value
| index_type
| WITH PARSER parser_name
| COMMENT 'string'
| {VISIBLE | INVISIBLE}
|ENGINE_ATTRIBUTE [=] 'string'
|SECONDARY_ENGINE_ATTRIBUTE [=] 'string'
}
check_constraint_definition:
[CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]
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: {
AUTOEXTEND_SIZE [=] value
| 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
| ENGINE_ATTRIBUTE [=] 'string'
| 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}
| START TRANSACTION
| SECONDARY_ENGINE_ATTRIBUTE [=] 'string'
| 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 миллиардов таблиц.
Сведения о физическом представлении таблицы см. в разделе 15.1.20.1, «Файлы, создаваемые оператором CREATE TABLE».
Оператор CREATE
TABLE имеет несколько аспектов, описанных в следующих разделах этого раздела:
Имя таблицы
-
tbl_nameИмя таблицы можно указать как
db_name.tbl_name, чтобы создать таблицу в определённой базе данных. Это работает независимо от наличия базы данных по умолчанию, при условии, что база данных существует. При использовании заключённых в кавычки идентификаторов, кавычки должны быть вокруг имени базы данных и имени таблицы отдельно. Например, запишите`mydb`.`mytbl`, а не`mydb.mytbl`.Правила допустимых имён таблиц приведены в разделе 11.2, «Имена объектов схемы».
-
IF NOT EXISTSПредотвращает возникновение ошибки, если таблица уже существует. Однако нет проверки, что структура существующей таблицы идентична структуре, указанной в операторе
CREATE TABLE.
Временные таблицы
Вы можете использовать ключевое слово TEMPORARY при создании таблицы. Таблица TEMPORARY видна только в текущей сессии и автоматически удаляется при закрытии сессии. Более подробная информация в разделе 15.1.20.2, «Оператор CREATE TEMPORARY TABLE».
Клонирование и копирование таблиц
-
LIKEИспользуйте
CREATE TABLE ... LIKEдля создания пустой таблицы на основе определения другой таблицы, включая любые атрибуты столбцов и индексы, определённые в исходной таблице:CREATE TABLE
new_tblLIKEorig_tbl;Более подробная информация в разделе 15.1.20.3, «Оператор CREATE TABLE ... LIKE».
-
[AS]query_expressionДля создания одной таблицы из другой добавьте оператор
SELECTв конце оператораCREATE TABLE:CREATE TABLE
new_tblAS SELECT * FROMorig_tbl;Более подробная информация в разделе 15.1.20.4, «Оператор CREATE TABLE ... SELECT».
-
IGNORE | REPLACEПараметры
IGNOREиREPLACEуказывают, как обрабатывать строки, которые дублируют значения уникального ключа при копировании таблицы с помощью оператораSELECT.Более подробная информация в разделе 15.1.20.4, «Оператор CREATE TABLE ... SELECT».
Типы данных и атрибуты столбцов
Существует жёсткое ограничение в 4096 столбцов на таблицу, но фактический максимум может быть меньше для данной таблицы и зависит от факторов, обсуждаемых в разделе 10.4.7, «Ограничения на количество столбцов таблицы и размер строки».
-
data_typedata_typeпредставляет тип данных в определении столбца. Для полного описания синтаксиса, доступного для задания типов данных столбцов, а также информации о свойствах каждого типа, см. главу 13, Типы данных.AUTO_INCREMENTприменяется только к целочисленным типам.-
Типы символьных данных (
CHAR,VARCHAR, типыTEXT,ENUM,SETи любые синонимы) могут включатьCHARACTER SETдля указания набора символов для столбца.CHARSET— синонимCHARACTER SET. Коллирование для набора символов можно указать с помощью атрибутаCOLLATE, а также любые другие атрибуты. Подробности см. в главе 12, Наборы символов, коллирования, Unicode. Пример:CREATE TABLE t (c CHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin);
MySQL 8.4 интерпретирует спецификации длины в определениях столбцов символьных данных в символах. Длины для
BINARYиVARBINARYуказаны в байтах. -
Для столбцов
CHAR,VARCHAR,BINARYиVARBINARYмогут быть созданы индексы, использующие только начальную часть значений столбцов, используя синтаксисдля указания длины префикса индекса. Столбцыcol_name(length)BLOBиTEXTтакже могут быть проиндексированы, но должна быть задана длина префикса. Длины префиксов задаются в символах для небинарных строковых типов и в байтах для бинарных строковых типов. То есть записи индекса состоят из первыхlengthсимволов каждого значения столбца для столбцовCHAR,VARCHARиTEXT, и первыхlengthбайт каждого значения столбца для столбцовBINARY,VARBINARYиBLOB. Индексация только префикса значений столбцов таким образом может значительно уменьшить размер файла индекса. Дополнительную информацию об индексах-префиксах см. в разделе 15.1.15, «Запрос CREATE INDEX».Только хранилища данных
InnoDBиMyISAMподдерживают индексацию столбцовBLOBиTEXT. Например:CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
Если заданный префикс индекса превышает максимальный размер типа данных столбца,
CREATE TABLEобрабатывает индекс следующим образом:Для неуникального индекса либо возникает ошибка (если включен строгий режим SQL), либо длина индекса уменьшается до попадания в пределы максимального размера типа данных столбца, и выводится предупреждение (если строгий режим SQL не включен).
Для уникального индекса возникает ошибка независимо от режима SQL, потому что уменьшение длины индекса может привести к возможности вставки не уникальных записей, которые не соответствуют требованиям уникальности.
Столбцы
JSONне могут быть индексированы. Можно обойти это ограничение, создав индекс на вычисляемом столбце, который извлекает скалярное значение из столбцаJSON. См. Индексация вычисляемого столбца для предоставления индекса столбца JSON для подробного примера.
-
NOT NULL | NULLЕсли не указаны ни
NULL, ниNOT NULL, столбец обрабатывается так, как будто указаноNULL.В MySQL 8.4 только хранилища данных
InnoDB,MyISAMиMEMORYподдерживают индексы на столбцах, которые могут иметь значенияNULL. В других случаях вы должны объявить индексируемые столбцы какNOT NULL, в противном случае произойдет ошибка. -
DEFAULTУказывает значение по умолчанию для столбца. Дополнительную информацию об обработке значений по умолчанию, в том числе случай, когда в определении столбца нет явного значения
DEFAULT, см. в разделе 13.6, «Значения по умолчанию типов данных».Если включен режим SQL
NO_ZERO_DATEилиNO_ZERO_IN_DATEи значение даты по умолчанию не соответствует этому режиму,CREATE TABLEвыдает предупреждение, если строгий режим SQL не включен, и ошибку, если включен. Например, при включенномNO_ZERO_IN_DATE,c1 DATE DEFAULT '2010-00-00'выведет предупреждение. -
VISIBLE,INVISIBLEУказывают видимость столбца. По умолчанию это
VISIBLE, если ни один из ключевых слов не указан. Таблица должна иметь хотя бы один видимый столбец. Попытка сделать все столбцы невидимыми приведет к ошибке. Дополнительную информацию см. в разделе 15.1.20.10, «Невидимые столбцы». -
AUTO_INCREMENTЦелочисленный столбец может иметь дополнительный атрибут
AUTO_INCREMENT. При вставке значенияNULL(рекомендуется) или0в индексированный столбецAUTO_INCREMENT, столбец устанавливается на следующее значение последовательности. Обычно это, гдеvalue+1value— наибольшее значение для столбца в таблице в данный момент. ПоследовательностиAUTO_INCREMENTначинаются с1.Чтобы получить значение
AUTO_INCREMENTпосле вставки строки, используйте функцию SQLLAST_INSERT_ID()или функцию C API. См. раздел 14.15, «Информационные функции» и .Если включен режим SQL
NO_AUTO_VALUE_ON_ZERO, можно сохранить0в столбцахAUTO_INCREMENTкак0без генерации нового значения последовательности. См. раздел 7.1.11, «Режимы SQL сервера».В таблице может быть только один столбец
AUTO_INCREMENT, он должен быть индексирован и не может иметь значенияDEFAULT. СтолбецAUTO_INCREMENTработает правильно только если содержит только положительные значения. Вставка отрицательного числа рассматривается как вставка очень большого положительного числа. Это сделано для предотвращения проблем с точностью при «переходе» чисел из положительных в отрицательные, а также для обеспечения того, что вы случайно не получите столбецAUTO_INCREMENT, содержащий0.Для таблиц
MyISAMможно указать вторичный столбецAUTO_INCREMENTв ключе из нескольких столбцов. См. раздел 5.6.9, «Использование AUTO_INCREMENT».Для совместимости MySQL с некоторыми приложениями ODBC можно найти значение
AUTO_INCREMENTдля последней вставленной строки с помощью следующего запроса:SELECT * FROM
tbl_nameWHEREauto_colIS NULLЭтот метод требует, чтобы переменная
sql_auto_is_nullне была установлена в 0. См. раздел 7.1.8, «Переменные системы сервера».Для получения информации о
InnoDBиAUTO_INCREMENTсм. раздел 17.6.1.6, «Обработка AUTO_INCREMENT в InnoDB». Для получения информации оAUTO_INCREMENTи репликации MySQL см. раздел 19.5.1.1, «Репликация и AUTO_INCREMENT».
-
COMMENTКомментарий к столбцу можно указать с помощью параметра
COMMENT, длина которого может достигать 1024 символов. Комментарий отображается с помощью командSHOW CREATE TABLEиSHOW FULL COLUMNS. Он также отображается в столбцеCOLUMN_COMMENTтаблицы Информационной схемыCOLUMNS. -
COLUMN_FORMATВ NDB Cluster также можно указать формат хранения данных для отдельных столбцов таблиц
NDBс помощью параметраCOLUMN_FORMAT. Допустимые форматы столбцов —FIXED,DYNAMICиDEFAULT.FIXEDиспользуется для указания хранения с фиксированной длиной,DYNAMICпозволяет столбцу иметь переменную длину, аDEFAULTзаставляет столбец использовать хранение с фиксированной или переменной длиной, определяемое типом данных столбца (возможно, переопределено параметромROW_FORMAT).Для таблиц
NDBзначение по умолчанию дляCOLUMN_FORMATравноFIXED.В NDB Cluster максимальный возможный смещение для столбца, определённого с помощью
COLUMN_FORMAT=FIXED, составляет 8188 байт. Дополнительную информацию и возможные обходные пути см. в разделе 25.2.7.5, «Ограничения, связанные с объектами базы данных в NDB Cluster».Параметр
COLUMN_FORMATв настоящее время не влияет на столбцы таблиц, использующих движки хранения, отличные отNDB. MySQL 8.4 игнорируетCOLUMN_FORMATбез ошибок. -
Параметры
ENGINE_ATTRIBUTEиSECONDARY_ENGINE_ATTRIBUTEиспользуются для указания атрибутов столбцов для первичных и вторичных движков хранения. Параметры зарезервированы для будущего использования.Присвоенное значение — строковая константа, содержащая допустимый JSON-документ или пустую строку (''). Недопустимый JSON отклоняется.
CREATE TABLE t1 (c1 INT ENGINE_ATTRIBUTE='{"key":"value"}');Значения
ENGINE_ATTRIBUTEиSECONDARY_ENGINE_ATTRIBUTEмогут быть повторены без ошибок. В этом случае используется последнее заданное значение.Значения
ENGINE_ATTRIBUTEиSECONDARY_ENGINE_ATTRIBUTEне проверяются сервером и не очищаются при изменении движка хранения таблицы. -
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Используется для указания выражения сгенерированного столбца. Для получения информации, см. раздел 15.1.20.8, «CREATE TABLE и сгенерированные столбцы».
могут быть индексированы.
InnoDBподдерживает вторичные индексы на . См. раздел 15.1.20.9, «Вторичные индексы и сгенерированные столбцы».
Индексы, внешние ключи и ограничения CHECK
Несколько ключевых слов применяются к созданию индексов, внешних ключей и ограничений CHECK. Для общего контекста помимо следующих описаний, см. раздел 15.1.15, «CREATE INDEX Statement», раздел 15.1.20.5, «Ограничения FOREIGN KEY» и раздел 15.1.20.6, «Ограничения CHECK».
-
CONSTRAINTsymbolОператор
CONSTRAINTможет быть использован для указания ограничения. Если оператор не указан, илиsymbolsymbolне включён после ключевого словаCONSTRAINT, MySQL автоматически сгенерирует имя ограничения, за исключением случаев, упомянутых ниже. Значениеsymbol, если используется, должно быть уникальным в рамках схемы (базы данных), для каждого типа ограничения. Повторное использованиеsymbolприведёт к ошибке. См. также обсуждение ограничений длины сгенерированных идентификаторов ограничений в разделе 11.2.1, «Ограничения длины идентификаторов».ПримечаниеЕсли оператор
CONSTRAINTне указан в определении внешнего ключа, илиsymbolsymbolне включён после ключевого словаCONSTRAINT, MySQL автоматически сгенерирует имя ограничения.Стандарт 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короткими, чтобы минимизировать издержки на хранение для вторичных индексов. Каждая запись вторичного индекса содержит копию столбцов первичного ключа для соответствующей строки. (См. раздел 17.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. См. раздел 15.7.7.23, «Оператор 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. Индексация всегда происходит по всему столбцу; индексация по префиксу столбца не поддерживается, и любая указанная длина префикса игнорируется. Подробную информацию об операциях см. в разделе 14.9, «Функции полнотекстового поиска». ОператорWITH PARSERможет быть указан как значениеindex_optionдля ассоциации плагина анализатора с индексом, если для полнотекстовой индексации и операций поиска требуется специальная обработка. Этот оператор допустим только для индексовFULLTEXT.InnoDBиMyISAMподдерживают плагины анализатора полнотекстового поиска. Дополнительную информацию см. в Плагины анализаторов полнотекстового поиска и Создание плагинов анализаторов полнотекстового поиска. -
SPATIALВы можете создавать индексы
SPATIALна пространственных типах данных. Пространственные типы поддерживаются только для таблицInnoDBиMyISAM, и индексированные столбцы должны быть объявлены какNOT NULL. См. раздел 13.4, «Пространственные типы данных». -
FOREIGN KEYMySQL поддерживает внешние ключи, которые позволяют вам осуществлять перекрестную ссылку связанных данных между таблицами, и ограничения внешних ключей, которые помогают поддерживать согласованность этих распределённых данных. Для определения и информации о параметрах см.
reference_definitionиreference_option.Разделенные таблицы, использующие движок хранения
InnoDB, не поддерживают внешние ключи. Дополнительную информацию см. в разделе 26.6, «Ограничения и пределы разделения». -
CHECKОператор
CHECKпозволяет создавать ограничения для проверки значений данных в строках таблицы. См. раздел 15.1.20.6, «Ограничения CHECK».
-
key_partСпецификация
key_partможет завершатьсяASCилиDESC, чтобы указать, хранятся ли значения индексов в порядке возрастания или убывания. По умолчанию используется возрастающий порядок, если указатель порядка не задан.-
Префиксы, определенные атрибутом
length, могут иметь длину до 767 байтов для таблицInnoDB, использующих формат строк или . Предел длины префикса составляет 3072 байта для таблицInnoDB, использующих формат строк или . Для таблицMyISAMпредел длины префикса составляет 1000 байтов.Длина префикса измеряется в байтах. Однако длина префикса для спецификаций индексов в операторах
CREATE TABLE,ALTER TABLEиCREATE INDEXинтерпретируется как число символов для типов строковых данных без бинарного представления (CHAR,VARCHAR,TEXT) и число байтов для типов строковых данных с бинарным представлением (BINARY,VARBINARY,BLOB). Учитывайте это при указании длины префикса для столбца строковых данных без бинарного представления, использующего многобайтовую кодировку. Значение
exprдля спецификацииkey_partможет принимать вид(CASTдля создания индекса с множественными значениями на столбце типаjson_pathAStypeARRAY)JSON. Индексы с множественными значениями содержит подробную информацию о создании, использовании и ограничениях индексов с множественными значениями.
-
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. См. Раздел 17.8.11, «Настройка порога слияния страниц индекса». -
VISIBLE,INVISIBLEУкажите видимость индекса. По умолчанию индексы видимы. Невидимый индекс не используется оптимизатором. Указание видимости индекса относится к индексам, отличным от первичных ключей (явных или неявных). Дополнительную информацию см. в Раздел 10.3.12, «Невидимые индексы».
Параметры
ENGINE_ATTRIBUTEиSECONDARY_ENGINE_ATTRIBUTEиспользуются для задания атрибутов индекса для движков первичного и вторичного хранения. Параметры зарезервированы для использования в будущем.
Дополнительную информацию о допустимых значениях
index_optionсм. в Разделе 15.1.15, «Оператор CREATE INDEX». Дополнительную информацию об индексах см. в Разделе 10.3.1, «Как MySQL использует индексы». -
-
reference_definitionПодробности синтаксиса и примеры для
reference_definitionсм. в Разделе 15.1.20.5, «Ограничения FOREIGN KEY».Таблицы
InnoDBиNDBподдерживают проверку ограничений внешнего ключа. Столбцы таблицы-получателя должны всегда быть явно указаны. Поддерживаются как действияON DELETE, так иON UPDATEнад внешними ключами. Дополнительную информацию и примеры см. в Разделе 15.1.20.5, «Ограничения FOREIGN KEY».Для других движков хранения MySQL Server анализирует и игнорирует синтаксис
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.7.2.3, «Различия в ограничениях FOREIGN KEY». -
reference_optionДополнительную информацию об опциях
RESTRICT,CASCADE,SET NULL,NO ACTIONиSET DEFAULTсм. в Разделе 15.1.20.5, «Ограничения FOREIGN KEY».
Параметры таблицы
Параметры таблицы используются для оптимизации поведения таблицы. В большинстве случаев, их указывать не нужно. Эти параметры применяются ко всем движкам хранения, если не указано иное. Параметры, не применяемые к определенному движку хранения, могут приниматься и запоминаться как часть определения таблицы. Эти параметры применяются, если вы позже используете ALTER TABLE для преобразования таблицы с использованием другого движка хранения.
-
ENGINEУказывает движок хранения для таблицы, используя одно из имен, представленных в следующей таблице. Имя движка может быть не заключено в кавычки или заключено в кавычки. Имя в кавычках
'DEFAULT'распознается, но игнорируется.Движок хранения Описание InnoDBТранзакционно-безопасные таблицы с блокировкой строк и внешними ключами. По умолчанию используется для новых таблиц. Смотрите Главу 17, Движок хранения InnoDB, а именно Раздел 17.1, «Введение в InnoDB», если у вас есть опыт работы с MySQL, но вы новичок в InnoDB.MyISAMДвоичный переносимый движок хранения, который в основном используется для чтений или преимущественно для чтений. Смотрите Раздел 18.2, «Движок хранения MyISAM». MEMORYДанные для этого движка хранения хранятся только в оперативной памяти. Смотрите Раздел 18.3, «Движок хранения MEMORY». CSVТаблицы, которые хранят строки в формате значений, разделенных запятыми. Смотрите Раздел 18.4, «Движок хранения CSV». ARCHIVEДвижок хранения для архивирования. Смотрите Раздел 18.5, «Движок хранения ARCHIVE». EXAMPLEПримерный движок. Смотрите Раздел 18.9, «Движок хранения EXAMPLE». FEDERATEDДвижок хранения, который обращается к удаленным таблицам. Смотрите Раздел 18.8, «Движок хранения FEDERATED». HEAPЭто синоним для MEMORY.MERGEКоллекция MyISAMтаблиц, используемых как одна таблица. Также известен какMRG_MyISAM. Смотрите Раздел 18.7, «Движок хранения MERGE».NDBКластеризованные, отказоустойчивые, основанные на памяти таблицы, поддерживающие транзакции и внешние ключи. Также известны как NDBCLUSTER. Смотрите Главу 25, MySQL NDB Cluster 8.4.По умолчанию, если указан движок хранения, который недоступен, оператор завершается с ошибкой. Вы можете изменить это поведение, удалив
NO_ENGINE_SUBSTITUTIONиз серверных SQL-режимов (см. Раздел 7.1.11, «Серверные SQL-режимы»), чтобы MySQL разрешал замену указанного движка на движок хранения по умолчанию. В таких случаях обычно используетсяInnoDB, что является значением по умолчанию для переменной системыdefault_storage_engine. КогдаNO_ENGINE_SUBSTITUTIONотключен, при неудовлетворении спецификации движка хранения появляется предупреждение. -
AUTOEXTEND_SIZEОпределяет величину, на которую
InnoDBувеличивает размер табличного пространства, когда оно заполняется. Значение должно быть кратно 4 МБ. Значение по умолчанию - 0, что приводит к расширению табличного пространства в соответствии с неявным поведением по умолчанию. Подробности см. в Разделе 17.6.3.9, «Конфигурация AUTOEXTEND_SIZE табличного пространства». -
AUTO_INCREMENTНачальное значение
AUTO_INCREMENTдля таблицы. В MySQL 8.4 это работает дляMyISAM,MEMORY,InnoDBиARCHIVEтаблиц. Чтобы установить первое значение автоинкремента для движков, которые не поддерживаютAUTO_INCREMENTпараметр таблицы, вставьте строку “dummy” со значением на единицу меньше желаемого значения после создания таблицы, а затем удалите строку dummy.Для движков, которые поддерживают параметр таблицы
AUTO_INCREMENTв операторахCREATE TABLE, вы также можете использоватьALTER TABLEдля сброса значенияtbl_nameAUTO_INCREMENT =NAUTO_INCREMENT. Значение не может быть меньше максимального значения, в настоящее время находящегося в столбце. -
AVG_ROW_LENGTHПриблизительная средняя длина строки для вашей таблицы. Вам нужно установить это только для больших таблиц с переменной длиной строк.
При создании
MyISAMтаблицы MySQL использует произведение параметровMAX_ROWSиAVG_ROW_LENGTH, чтобы определить размер результирующей таблицы. Если вы не укажете ни один из параметров, максимальный размер файлов данных и индексовMyISAMпо умолчанию составляет 256 ТБ. (Если ваша операционная система не поддерживает файлы такого размера, размер таблицы ограничен пределом размера файла.) Если вы хотите уменьшить размеры указателей, чтобы сделать индекс меньше и быстрее, и вам не нужны большие файлы, вы можете уменьшить размер указателя по умолчанию, установив переменную системыmyisam_data_pointer_size. (См. Раздел 7.1.8, «Переменные системы сервера».) Если вы хотите, чтобы все ваши таблицы могли расти сверх предела по умолчанию и готовы к тому, что ваши таблицы будут немного медленнее и больше, чем необходимо, вы можете увеличить размер указателя по умолчанию, установив эту переменную. Установка значения в 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. Смотрите Раздел 17.8.11, «Настройка порога слияния для страниц индекса».Установка параметров NDB_TABLE. Комментарий к таблице в операторе
CREATE TABLE, который создаётNDBтаблицу, или в операторе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 базы данных MySQLTABLES.Этот синтаксис комментариев также поддерживается операторами
ALTER TABLEдляNDBтаблиц. Имейте в виду, что комментарий к таблице, используемый сALTER TABLE, заменяет любой существующий комментарий, который могла иметь таблица ранее.Установка параметра
MERGE_THRESHOLDв комментариях к таблицам не поддерживается дляNDBтаблиц (он игнорируется).Для получения полной информации о синтаксисе и примерах см. Раздел 15.1.20.12, «Настройка параметров NDB Comment».
-
COMPRESSIONАлгоритм сжатия, используемый для сжатия страниц на уровне страницы для
InnoDBтаблиц. Поддерживаемые значения включаютZlib,LZ4иNone. АтрибутCOMPRESSIONбыл введён с прозрачным сжатием страниц. Сжатие страниц поддерживается только дляInnoDBтаблиц, находящихся в табличных пространствах, и доступно только на платформах Linux и Windows, поддерживающих разреженные файлы и пробивку отверстий. Подробности см. в Разделе 17.9.2, «Сжатие страниц InnoDB». -
CONNECTIONСтрока подключения для
FEDERATEDтаблицы.ПримечаниеБолее ранние версии MySQL использовали параметр
COMMENTдля строки подключения.
-
DATA DIRECTORY,INDEX DIRECTORYДля
InnoDB, клаузулаDATA DIRECTORY='разрешает создание таблиц вне каталога данных. Для использования клаузулыdirectory'DATA DIRECTORYнеобходимо включить переменнуюinnodb_file_per_table. Полный путь к каталогу должен быть указан и известенInnoDB. Дополнительную информацию см. в разделе 17.6.1.2, «Создание таблиц в формате внешнего хранилища».При создании
MyISAMтаблиц, можно использовать клаузулуDATA DIRECTORY=', клаузулуdirectory'INDEX DIRECTORY='или обе. Они указывают, соответственно, место размещения файла данных и файла индексов для таблицыdirectory'MyISAM. В отличие отInnoDBтаблиц, MySQL не создает подкаталоги, соответствующие имени базы данных, при созданииMyISAMтаблицы с опциямиDATA DIRECTORYилиINDEX DIRECTORY. Файлы создаются в указанном каталоге.Для использования опций
DATA DIRECTORYилиINDEX DIRECTORYтаблицы необходимо иметь привилегиюFILE.ВажноОпции уровня таблицы
DATA DIRECTORYиINDEX DIRECTORYигнорируются для разнесенных таблиц. (Ошибка #32091)Эти опции работают только тогда, когда вы не используете опцию
--skip-symbolic-links. Ваша операционная система также должна иметь рабочую, потокобезопасную функциюrealpath(). Более подробную информацию см. в разделе 10.12.2.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в разделе 7.1.8, «Системные переменные сервера». (MyISAMтолько.) -
ENCRYPTIONКлаузула
ENCRYPTIONвключает или отключает шифрование данных на уровне страниц дляInnoDBтаблицы. Для включения шифрования необходимо установить и настроить плагин хранилища ключей. КлаузулаENCRYPTIONможет быть указана при создании таблицы в табличном пространстве по отдельным файлам или при создании таблицы в общем табличном пространстве.Опция
ENCRYPTIONподдерживается только хранилищем данныхInnoDB; поэтому она работает только если движок по умолчанию —InnoDB, или если операторCREATE TABLEтакже указываетENGINE=InnoDB. В противном случае оператор отклоняется с сообщением о...Таблица наследует шифрование схемы по умолчанию, если клаузула
ENCRYPTIONне указана. Если переменнаяtable_encryption_privilege_checkвключена, для создания таблицы с клаузулойENCRYPTION, значение которой отличается от шифрования схемы по умолчанию, требуется привилегияTABLE_ENCRYPTION_ADMIN. При создании таблицы в общем табличном пространстве шифрование таблицы и табличного пространства должно совпадать.Указание клаузулы
ENCRYPTIONсо значением, отличным от'N'или'', запрещено при использовании движка хранилища данных, не поддерживающего шифрование.Для получения дополнительной информации см. раздел 17.13, «Шифрование данных InnoDB при хранении на диске».
-
Опции
ENGINE_ATTRIBUTEиSECONDARY_ENGINE_ATTRIBUTEиспользуются для указания атрибутов таблицы для первичных и вторичных движков хранилища. Опции зарезервированы для будущего использования.Присвоенное значение любой из этих опций должно быть строковым литералом, содержащим допустимый JSON-документ или пустой строкой (''). Недопустимый JSON отклоняется.
CREATE TABLE t1 (c1 INT) ENGINE_ATTRIBUTE='{"key":"value"}';Значения
ENGINE_ATTRIBUTEиSECONDARY_ENGINE_ATTRIBUTEмогут быть повторены без ошибок. В этом случае используется последнее указанное значение.Значения
ENGINE_ATTRIBUTEиSECONDARY_ENGINE_ATTRIBUTEне проверяются сервером и не очищаются при изменении движка хранилища данных таблицы. -
INSERT_METHODЕсли вы хотите вставить данные в
MERGEтаблицу, вы должны указать с помощьюINSERT_METHODтаблицу, в которую должна быть вставлена строка.INSERT_METHOD— опция, полезная только дляMERGEтаблиц. Используйте значениеFIRSTилиLAST, чтобы вставки направлялись в первую или последнюю таблицу, или значениеNO, чтобы предотвратить вставки. См. раздел 18.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. Более подробную информацию см. в разделе 17.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сжатие таблиц не поддерживает эти размеры страниц.InnoDBне поддерживает опциюKEY_BLOCK_SIZEпри создании временных таблиц. -
MAX_ROWSМаксимальное количество строк, которое планируется хранить в таблице. Это не жёсткое ограничение, а скорее подсказка для движка хранилища, что таблица должна быть способна хранить по крайней мере это количество строк.
ВажноИспользование
MAX_ROWSсNDBтаблицами для управления количеством разделов таблицы устарело. Оно по-прежнему поддерживается в более поздних версиях для обратной совместимости, но может быть удалено в будущих версиях. Используйте 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Этот параметр не используется.
-
ROW_FORMATОпределяет физический формат, в котором хранятся строки.
При создании таблицы с отключенным, используется форма строки по умолчанию для хранилища данных, если заданный формат строки не поддерживается. Фактический формат строки таблицы сообщается в столбце
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. Дополнительную информацию см. в разделе Определении формата строк таблицы. Для более эффективного хранения типов данных, особенно типов
BLOB, используйте форматDYNAMIC. Требования, связанные с форматом строкDYNAMIC, см. в разделе DYNAMIC Row Format.Чтобы включить сжатие для таблиц
InnoDB, укажитеROW_FORMAT=COMPRESSED. ПараметрROW_FORMAT=COMPRESSEDне поддерживается при создании временных таблиц. Требования, связанные с форматом строкCOMPRESSED, см. в разделе Раздел 17.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см. в разделе Раздел 17.10, «Форматы строк InnoDB».
Для таблиц
MyISAMзначение параметра может бытьFIXEDилиDYNAMICдля статического или динамического формата строки. myisampack устанавливает тип вCOMPRESSED. См. раздел Раздел 18.2.3, «Форматы хранения таблиц MyISAM».Для таблиц
NDBзначение параметраROW_FORMATпо умолчанию равноDYNAMIC. -
-
START TRANSACTIONЭто параметр таблицы для внутреннего использования, позволяющий
CREATE TABLE ... SELECTрегистрироваться как единая атомная транзакция в двоичном журнале при использовании репликации на основе строк с хранилищем данных, поддерживающим атомные DDL. ТолькоBINLOG,COMMITиROLLBACKоператоры разрешены послеCREATE TABLE ... START TRANSACTION. Подробную информацию см. в разделе Раздел 15.1.1, «Поддержка атомных операторов определения данных». -
STATS_AUTO_RECALCУказывает, следует ли автоматически пересчитывать статистику для таблицы
InnoDB. ЗначениеDEFAULTпозволяет определить постоянные параметры статистики таблицы параметром конфигурацииinnodb_stats_auto_recalc. Значение1приводит к пересчету статистики, когда 10% данных в таблице изменились. Значение0предотвращает автоматический пересчет для этой таблицы; в этом случае выполните операторANALYZE TABLEдля пересчета статистики после существенных изменений в таблице. Дополнительную информацию о функции постоянной статистики см. в разделе Раздел 17.8.10.1, «Настройка параметров постоянной статистики оптимизатора». -
STATS_PERSISTENTУказывает, следует ли включить постоянные статистические данные для таблицы
InnoDB. ЗначениеDEFAULTпозволяет определить постоянные параметры статистики таблицы параметром конфигурацииinnodb_stats_persistent. Значение1включает постоянную статистику для таблицы, а значение0выключает эту функцию. После включения постоянной статистики с помощью командыCREATE TABLEилиALTER TABLEвыполните операторANALYZE TABLEдля расчета статистики после загрузки репрезентативных данных в таблицу. Дополнительную информацию о функции постоянной статистики см. в разделе Раздел 17.8.10.1, «Настройка параметров постоянной статистики оптимизатора». -
STATS_SAMPLE_PAGESКоличество страниц индекса для выборки при оценке кардинальности и других статистических данных для индексированного столбца, таких как те, которые вычисляет оператор
ANALYZE TABLE. Дополнительную информацию см. в разделе Раздел 17.8.10.1, «Настройка параметров постоянной статистики оптимизатора».
-
TABLESPACEОператор
TABLESPACEможет использоваться для создания таблицыInnoDBв существующем общем табличном пространстве, табличном пространстве с файлом на таблицу или системном табличном пространстве.CREATE TABLE
tbl_name... TABLESPACE [=]tablespace_nameУказанное вами общее табличное пространство должно существовать до использования оператора
TABLESPACE. Сведения о общих табличных пространствах см. в разделе 17.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_file_per_tableвключено.Оператор
DATA DIRECTORYразрешен сCREATE TABLE ... TABLESPACE=innodb_file_per_table, но в противном случае не поддерживается в сочетании с операторомTABLESPACE. Каталог, указанный в оператореDATA DIRECTORY, должен быть известенInnoDB. Дополнительную информацию см. в Использование оператора DATA DIRECTORY.ПримечаниеПоддержка операторов
TABLESPACE = innodb_file_per_tableиTABLESPACE = innodb_temporaryсCREATE TEMPORARY TABLEустарела; ожидается, что она будет удалена в будущих версиях MySQL.Опция таблицы
STORAGEиспользуется только с таблицамиNDB.STORAGEопределяет тип используемого хранилища и может быть либоDISK, либоMEMORY.TABLESPACE ... STORAGE DISKприсваивает таблицу табличному пространству данных дисков NDB Cluster.STORAGE DISKнельзя использовать вCREATE TABLE, если ему не предшествуетTABLESPACEtablespace_name.Для
STORAGE MEMORYимя табличного пространства необязательно, поэтому вы можете использоватьTABLESPACEили простоtablespace_nameSTORAGE MEMORYSTORAGE MEMORY, чтобы явно указать, что таблица находится в оперативной памяти.Дополнительную информацию см. в разделе 25.6.11, «Таблицы данных дисков NDB Cluster».
-
Используется для доступа к набору идентичных
MyISAMтаблиц как к одной. Это работает только с таблицамиMERGE. См. раздел 18.7, «Двигатель MERGE».Вы должны иметь права
SELECT,UPDATEиDELETEдля таблиц, которые вы сопоставляете с таблицейMERGE.ПримечаниеРаньше все используемые таблицы должны были находиться в той же базе данных, что и сама таблица
MERGE. Это ограничение больше не действует.
Разбиение таблицы
partition_options может использоваться для управления разбиением таблицы, созданной с помощью CREATE TABLE.
Не все опции, показанные в синтаксисе для partition_options в начале этого раздела, доступны для всех типов разбиения. Для получения информации, специфичной для каждого типа, см. соответствующие списки, а также главу 26, Разбиение, для получения более подробной информации о работе и использовании разбиения в MySQL, а также дополнительных примеров создания таблиц и других операторов, относящихся к разбиению MySQL.
Разбиения можно изменять, объединять, добавлять в таблицы и удалять из таблиц. Для получения базовой информации о операторах MySQL для выполнения этих задач см. раздел 15.1.9, «Оператор ALTER TABLE». Для более подробных описаний и примеров см. раздел 26.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на количество разделов (то есть модуль). Примеры и дополнительная информация см. в разделе 26.2.4 «HASH Partitioning».Ключевое слово
LINEARпредполагает несколько другой алгоритм. В этом случае номер раздела, в котором хранится строка, вычисляется как результат одной или нескольких логических операцийAND. Обсуждение и примеры линейного хэширования см. в разделе 26.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. То есть номер раздела находится с использованием оператора&, а не модуля (см. раздел 26.2.4.1 «LINEAR HASH Partitioning» и раздел 26.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.5 и более поздних версиях. (Разделяемые таблицы, созданные с использованием функций хэширования ключей, применяемых в MySQL 5.5 и более поздних версиях, не могут использоваться сервером MySQL 5.1.) Отсутствие указания опции имеет тот же эффект, что и использованиеALGORITHM=2. Эта опция предназначена в основном для использования при обновлении или понижении версий[LINEAR] KEYразделяемых таблиц между MySQL 5.1 и более поздними версиями MySQL, или для создания таблиц, разделенных поKEYилиLINEAR KEYна сервере MySQL 5.5 или более поздней версии, которые можно использовать на сервере MySQL 5.1. Более подробная информация приведена в разделе 15.1.9.1 «ALTER TABLE Partition Operations».mysqldump записывает эту опцию в комментариях с указанием версии.
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 8.4 можно преодолеть это ограничение в таблице, определенной с помощью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').Более подробная информация см. в разделе 26.2.1 «RANGE Partitioning» и разделе 26.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 8.4 вы можете преодолеть это ограничение, используя разбиение по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для каждого раздела. Это используется для определения строк, которые будут храниться в этом разделе. См. обсуждения типов разбиения в главе 26, «Разбиение», для примеров синтаксиса. -
[STORAGE] ENGINEMySQL принимает опцию
[STORAGE] ENGINEдляPARTITIONиSUBPARTITION. В настоящее время единственный способ использования этой опции — установить все разделы или все подразделы в один и тот же движок хранения, и попытка установить разные движки хранения для разделов или под-разделов в одной таблице вызывает ошибку ERROR 1469 (HY000): Смешение обработчиков в разделах не разрешено в этой версии MySQL. -
COMMENTНеобязательное предложение
COMMENTможет быть использовано для указания строки, описывающей раздел. Пример:COMMENT = 'Data for the years previous to 1999'
Максимальная длина комментария к разделу составляет 1024 символа.
-
DATA DIRECTORYиINDEX DIRECTORYDATA DIRECTORYиINDEX DIRECTORYмогут использоваться для указания каталога, в котором соответственно хранятся данные и индексы для этого раздела. И, иdata_dirдолжны быть полными именами системных путей.index_dirКаталог, указанный в предложении
DATA DIRECTORY, должен быть известенInnoDB. Более подробную информацию см. в Использовании предложения DATA DIRECTORY.Для использования опции раздела
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.Для каждого раздела может быть указан один каталог данных и один каталог индексов. Если ничего не указано, данные и индексы по умолчанию хранятся в каталоге базы данных таблицы.
Опции
DATA DIRECTORYиINDEX DIRECTORYигнорируются при создании разбиеной таблицы, еслиNO_DIR_IN_CREATEактивна. -
MAX_ROWSиMIN_ROWSМогут использоваться для указания соответственно максимального и минимального количества строк, хранимых в разделе. Значения для
max_number_of_rowsиmin_number_of_rowsдолжны быть положительными целыми числами. Как и в случае с параметрами таблицы с аналогичными названиями, они действуют только как “предложения” для сервера и не являются жёсткими ограничениями. -
TABLESPACEМожет использоваться для назначения
InnoDBфайловой таблицы пространства имен для раздела путём указанияTABLESPACE `innodb_file_per_table`. Все разделы должны принадлежать одному и тому же движку хранения.Размещение разбиений таблицы
InnoDBв общих пространствах именInnoDBне поддерживается. Общие пространства имён включают системное пространство имёнInnoDBи общие пространства имён.
-
-
subpartition_definitionОпределение раздела может необязательно содержать одно или несколько предложений
subpartition_definition. Каждое из них состоит как минимум из предложенияSUBPARTITION, гдеnamename— это идентификатор под-раздела. За исключением замены ключевого словаPARTITIONнаSUBPARTITION, синтаксис определения под-раздела идентичен синтаксису определения раздела.Подразделение должно выполняться по
HASHилиKEYи может выполняться только для разделовRANGEилиLIST. См. Раздел 26.2.6, «Подразделение».
Разбиение по сгенерированным столбцам
Разбиение по сгенерированным столбцам допускается. Например:
CREATE TABLE t1 (
s1 INT,
s2 INT AS (EXP(s1)) STORED
)
PARTITION BY LIST (s2) (
PARTITION p1 VALUES IN (1)
);
Разбиение рассматривает сгенерированный столбец как обычный столбец, что позволяет обойти ограничения функций, которые не разрешены для разбиения (см. Раздел 26.6.3, «Ограничения разбиения, относящиеся к функциям»). Приведенный выше пример демонстрирует эту технику: EXP() не может быть использован напрямую в PARTITION BY фрагменте, но сгенерированный столбец, определенный с помощью EXP(), разрешен.
© 2025 Oracle
Licensed under the GPLv2 License.