15.1.21 Оператор CREATE TABLE
- 15.1.21.1 Файлы, созданные оператором CREATE TABLE
- 15.1.21.2 Оператор CREATE TEMPORARY TABLE
- 15.1.21.3 Оператор CREATE TABLE ... LIKE
- 15.1.21.4 Оператор CREATE TABLE ... SELECT
- 15.1.21.5 Ограничения FOREIGN KEY
- 15.1.21.6 Ограничения CHECK
- 15.1.21.7 Тихие изменения спецификаций столбцов
- 15.1.21.8 Оператор CREATE TABLE и сгенерированные столбцы
- 15.1.21.9 Вторичные индексы и сгенерированные столбцы
- 15.1.21.10 Скрытые столбцы
- 15.1.21.11 Сгенерированные скрытые первичные ключи
- 15.1.21.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.21.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.21.2, “Оператор CREATE TEMPORARY TABLE”.
Клонирование и копирование таблиц
-
LIKEИспользуйте
CREATE TABLE ... LIKE, чтобы создать пустую таблицу на основе определения другой таблицы, включая все атрибуты столбцов и индексы, определённые в исходной таблице:CREATE TABLE
new_tblLIKEorig_tbl;Подробнее см. Раздел 15.1.21.3, “Оператор CREATE TABLE ... LIKE”.
-
[AS]query_expressionДля создания одной таблицы из другой добавьте оператор
SELECTв конце оператораCREATE TABLE:CREATE TABLE
new_tblAS SELECT * FROMorig_tbl;Подробнее см. Раздел 15.1.21.4, “Оператор CREATE TABLE ... SELECT”.
-
IGNORE | REPLACEПараметры
IGNOREиREPLACEуказывают, как обработать строки, дублирующие уникальные значения ключей, при копировании таблицы с помощью оператораSELECT.Подробнее см. Раздел 15.1.21.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 9.2 интерпретирует спецификации длины в определениях символьных столбцов в символах. Длины для
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 9.2 только хранилища данных
InnoDB,MyISAMиMEMORYподдерживают индексы на столбцах, которые могут содержать значенияNULL. В других случаях вы должны объявить индексируемые столбцы какNOT NULL, иначе произойдёт ошибка. -
DEFAULTУказывает значение по умолчанию для столбца. Дополнительную информацию об обработке значения по умолчанию, включая случай, когда в определении столбца нет явного значения
DEFAULT, см. в Разделе 13.6, «Значения по умолчанию для типов данных».Если включен режим SQL
NO_ZERO_DATEилиNO_ZERO_IN_DATE, а значение по умолчанию для даты не является корректным согласно этому режиму,CREATE TABLEвыдает предупреждение, если строгий режим SQL не включен, и ошибку, если строгий режим SQL включен. Например, при включенном режимеNO_ZERO_IN_DATE,c1 DATE DEFAULT '2010-00-00'выдаст предупреждение. -
VISIBLE,INVISIBLEУкажите видимость столбца. Значение по умолчанию —
VISIBLE, если ни один из ключевых слов не указан. Таблица должна иметь хотя бы один видимый столбец. Попытка сделать все столбцы невидимыми приведёт к ошибке. Подробнее см. в Разделе 15.1.21.10, «Невидимые столбцы». -
AUTO_INCREMENTЦелочисленный столбец может иметь дополнительный атрибут
AUTO_INCREMENT. При вставке значенияNULL(рекомендуется) или0в индексируемый столбецAUTO_INCREMENT, значение столбца устанавливается на следующее значение последовательности. Обычно это, гдеvalue+1value— наибольшее значение для столбца в таблице на данный момент. ПоследовательностиAUTO_INCREMENTначинаются с1.Для извлечения значения
AUTO_INCREMENTпосле вставки строки используйте функцию SQLLAST_INSERT_ID()или функцию API C. См. Раздел 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 9.2 игнорирует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.21.8, «CREATE TABLE и сгенерированные столбцы».
могут быть индексированы.
InnoDBподдерживает вторичные индексы на . См. Раздел 15.1.21.9, «Вторичные индексы и сгенерированные столбцы».
Индексы, внешние ключи и ограничения CHECK
Некоторые ключевые слова применяются к созданию индексов, внешних ключей и CHECK ограничений. Для общей информации помимо следующих описаний см. Раздел 15.1.15, «CREATE INDEX Statement», Раздел 15.1.21.5, «Ограничения FOREIGN KEY» и Раздел 15.1.21.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.24, «Оператор 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.21.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Для таблиц
MyISAMKEY_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.21.5, «Ограничения FOREIGN KEY».Таблицы
InnoDBиNDBподдерживают проверку ограничений внешних ключей. Столбцы таблицы, на которую ссылаются внешние ключи, должны всегда быть явно указаны. Поддерживаются оба действияON DELETEиON UPDATEнад внешними ключами. Более подробную информацию и примеры см. в Разделе 15.1.21.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 также принимает неявные ссылки на первичный ключ родительской таблицы. Более подробную информацию см. в Разделе 15.1.21.5, «Ограничения FOREIGN KEY», а также в Разделе 1.7.2.3, «Отличия ограничений FOREIGN KEY». -
reference_optionДополнительную информацию о параметрах
RESTRICT,CASCADE,SET NULL,NO ACTIONиSET DEFAULTсм. в Разделе 15.1.21.5, «Ограничения FOREIGN KEY».
Параметры таблицы
Параметры таблицы используются для оптимизации поведения таблицы. В большинстве случаев их указывать не нужно. Эти параметры применяются ко всем движкам хранилищ, если не указано иное. Параметры, которые не применяются к данному движку хранилищ, могут приниматься и запоминаться как часть определения таблицы. Затем эти параметры применяются, если вы впоследствии используете ALTER TABLE для преобразования таблицы для использования другого движка хранилищ.
-
ENGINEУказывает движок хранения для таблицы, используя одно из названий, представленных в следующей таблице. Имя движка может быть необрамленным или заключенным в кавычки. Заключенное в кавычки имя
'DEFAULT'распознается, но игнорируется.Движок хранения Описание InnoDBТранзакционно-безопасные таблицы с блокировкой строк и внешними ключами. По умолчанию используется для новых таблиц. См. Главу 17, Движок хранения InnoDB, а в частности Раздел 17.1, «Введение в InnoDB», если у вас есть опыт работы с MySQL, но вы новичок в InnoDB.MyISAMДвоичный переносимый движок хранения, который в основном используется для нагрузок, ориентированных на чтение или преимущественно на чтение. См. Раздел 18.2, «Движок хранения MyISAM». MEMORYДанные для этого движка хранения хранятся только в памяти. См. Раздел 18.3, «Движок хранения MEMORY». CSVТаблицы, которые хранят строки в формате 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 9.2.По умолчанию, если указан движок хранения, который недоступен, операция завершается с ошибкой. Вы можете изменить это поведение, удалив
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 9.2 это работает для таблицMyISAM,MEMORY,InnoDBиARCHIVE. Чтобы установить первое значение автоинкремента для движков, которые не поддерживают опцию таблицыAUTO_INCREMENT, вставьте строку “dummy” со значением, на единицу меньшим желаемого значения, после создания таблицы, а затем удалите строку dummy.Для движков, которые поддерживают опцию
AUTO_INCREMENTтаблицы вCREATE TABLEоператорах, вы также можете использоватьALTER TABLEдля сброса значенияtbl_nameAUTO_INCREMENT =NAUTO_INCREMENT. Значение не может быть меньше максимального значения, в настоящее время находящегося в столбце. -
AVG_ROW_LENGTHПриблизительная оценка средней длины строки для вашей таблицы. Вам необходимо установить это только для больших таблиц с изменяемыми по размеру строками.
При создании таблицы
MyISAMMySQL использует произведение параметров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 таблицы MySQL Information SchemaTABLES.Этот синтаксис комментариев также поддерживается операторами
ALTER TABLEдля таблицNDB. Имейте в виду, что комментарий к таблице, используемый сALTER TABLE, заменяет любой существующий комментарий, который могла иметь таблица ранее.Установка параметра
MERGE_THRESHOLDв комментариях таблиц не поддерживается для таблицNDB(он игнорируется).Для получения полной информации о синтаксисе и примеров см. Раздел 15.1.21.12, «Настройка параметров комментариев NDB».
-
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'innodb_file_per_tableдолжна быть включена для использования фразыDATA DIRECTORY. Полный путь к каталогу должен быть указан и известен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обрабатывает это значение как максимальное. Если вы планируете создавать очень большие таблицы MySQL 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 Table and Page Compression”.Формат строк, используемый в более старых версиях 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 Row Formats”.
Для таблиц
MyISAMзначение параметра может бытьFIXEDилиDYNAMICдля статического или переменного формата строк. myisampack устанавливает тип вCOMPRESSED. См. Раздел 18.2.3, “MyISAM Table Storage Formats”.Для таблиц
NDBзначение параметра по умолчаниюROW_FORMATравноDYNAMIC. -
-
START TRANSACTIONЭто внутренний параметр таблицы, используемый для записи
CREATE TABLE ... SELECTкак единственной атомарной транзакции в двоичном журнале при использовании репликации на основе строк с справочной системой, которая поддерживает атомарные операторы DDL. Допускаются только операторыBINLOG,COMMITиROLLBACKпослеCREATE TABLE ... START TRANSACTION. Для получения связанной информации см. Раздел 15.1.1, “Atomic Data Definition Statement Support”. -
STATS_AUTO_RECALCУказывает, нужно ли автоматически пересчитывать статистику для таблицы
InnoDB. ЗначениеDEFAULTопределяет значение параметра постоянной статистики для таблицы с помощью параметра конфигурацииinnodb_stats_auto_recalc. Значение1приводит к пересчёту статистики, когда 10% данных в таблице были изменены. Значение0предотвращает автоматический пересчёт для этой таблицы; в этом случае необходимо выполнить операторANALYZE TABLEдля пересчёта статистики после внесения существенных изменений в таблицу. Для получения дополнительной информации о функции постоянной статистики см. Раздел 17.8.10.1, “Configuring Persistent Optimizer Statistics Parameters”. -
STATS_PERSISTENTУказывает, нужно ли включить постоянную статистику для таблицы
InnoDB. ЗначениеDEFAULTопределяет значение параметра постоянной статистики для таблицы с помощью параметра конфигурацииinnodb_stats_persistent. Значение1включает постоянную статистику для таблицы, в то время как значение0отключает эту функцию. После включения постоянной статистики с помощью оператораCREATE TABLEилиALTER TABLEвыполните операторANALYZE TABLEдля расчёта статистики после загрузки репрезентативных данных в таблицу. Для получения дополнительной информации о функции постоянной статистики см. Раздел 17.8.10.1, “Configuring Persistent Optimizer Statistics Parameters”. -
STATS_SAMPLE_PAGESКоличество страниц индексов для выборки при оценке кардинальности и других статистических данных для индексированного столбца, таких как те, которые рассчитываются оператором
ANALYZE TABLE. Для получения дополнительной информации см. Раздел 17.8.10.1, “Configuring Persistent Optimizer Statistics Parameters”.
-
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 Disk Data Tables».
-
Используется для доступа к набору идентичных
MyISAMтаблиц как к одной. Это работает только сMERGEтаблицами. См. раздел 18.7 «Двигатель MERGE».Для таблиц, которые вы отображаете в таблице
MERGE, вам необходимо иметь привилегииSELECT,UPDATEиDELETE.ПримечаниеРаньше все используемые таблицы должны были находиться в одной базе данных, что и таблица
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 9.2 вы можете обойти это ограничение в таблице, определённой с помощью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 9.2 вы можете обойти это ограничение, используя разбиение по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. В настоящее время этот параметр можно использовать только для установки одинакового хранилища для всех партиций или всех подпартиций, и попытка установить разные хранилища для партиций или подпартиций в одной таблице вызывает ошибку Ошибка 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имеет значение true. -
MAX_ROWSиMIN_ROWSМогут использоваться для указания, соответственно, максимального и минимального количества строк, хранящихся в партиции. Значения
max_number_of_rowsиmin_number_of_rowsдолжны быть положительными целыми числами. Как и в случае с параметрами таблицы с аналогичными именами, они действуют только как “рекомендации” для сервера и не являются жесткими ограничениями. -
TABLESPACEМожет использоваться для обозначения табличного пространства с файлом на партицию для партиции, указав
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.