Spec-Zone.ru › MySQL 9.2

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 имеет несколько аспектов, описанных в следующих разделах этого раздела:

  • Имя таблицы

  • Временные таблицы

  • Клонирование и копирование таблиц

  • Типы данных столбцов и атрибуты

  • Индексы, внешние ключи и ограничения CHECK

  • Параметры таблицы

  • Разбиение таблицы

Имя таблицы

  • 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_tbl LIKE orig_tbl;
    

    Подробнее см. Раздел 15.1.21.3, “Оператор CREATE TABLE ... LIKE”.

  • [AS] query_expression

    Для создания одной таблицы из другой добавьте оператор SELECT в конце оператора CREATE TABLE:

    CREATE TABLE new_tbl AS SELECT * FROM orig_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_type

    data_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+1, где value — наибольшее значение для столбца в таблице на данный момент. Последовательности AUTO_INCREMENT начинаются с 1.

    Для извлечения значения AUTO_INCREMENT после вставки строки используйте функцию SQL LAST_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_name WHERE auto_col IS 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».

  • CONSTRAINT symbol

    Оператор CONSTRAINT symbol может использоваться для задания имени ограничения. Если этот оператор не задан или symbol не указано после ключевого слова CONSTRAINT, MySQL автоматически генерирует имя ограничения, за исключением случаев, упомянутых ниже. Значение symbol, если используется, должно быть уникальным для схемы (базы данных), для типа ограничения. Дублирование symbol приводит к ошибке. Также см. обсуждение ограничений длины идентификаторов ограничений в разделе 11.2.1, «Ограничения длины идентификаторов».

    Примечание

    Если оператор CONSTRAINT symbol не задан в определении внешнего ключа или symbol не указано после ключевого слова 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 tbl_name. См. раздел 15.7.7.24, «Оператор SHOW INDEX».

  • KEY | INDEX

    KEY обычно является синонимом для 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 KEY

    MySQL поддерживает внешние ключи, позволяющие ссылаться на связанные данные в разных таблицах, и ограничения внешних ключей, которые помогают поддерживать согласованность этих данных, распределенных по таблицам. Для получения информации об определении и параметрах см. 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_path AS type ARRAY) для создания индекса с несколькими значениями по столбцу 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 символов.

      Вы можете задать значение InnoDB MERGE_THRESHOLD для отдельного индекса, используя предложение index_option COMMENT. Смотрите Раздел 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_name AUTO_INCREMENT = N для сброса значения AUTO_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 символов.

    Вы можете установить значение InnoDB MERGE_THRESHOLD для таблицы с помощью предложения table_option COMMENT. См. Раздел 17.8.11, «Настройка порога слияния для страниц индекса».

    Установка параметров NDB_TABLE. Комментарий к таблице в операторе CREATE TABLE, который создаёт таблицу NDB, или в операторе ALTER TABLE, который изменяет её, также может использоваться для указания одного или четырёх параметров NDB_TABLE NOLOGGING, 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 Schema TABLES.

    Этот синтаксис комментариев также поддерживается операторами 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_size 32 КБ и 64 КБ. Сжатие таблиц InnoDB не поддерживает эти размеры страниц.

    InnoDB не поддерживает опцию KEY_BLOCK_SIZE при создании временных таблиц.

  • MAX_ROWS

    Максимальное количество строк, которое вы планируете хранить в таблице. Это не жёсткое ограничение, а скорее подсказка для движка хранения о том, что таблица должна иметь возможность хранить как минимум такое количество строк.

    Важно

    Использование MAX_ROWS с таблицами NDB для управления количеством разделов таблицы устарело. Оно остаётся поддерживаемым в более поздних версиях для обратной совместимости, но может быть удалено в будущих выпусках. Используйте вместо этого PARTITION_BALANCE; см. Установка параметров NDB_TABLE.

    Движок хранения NDB обрабатывает это значение как максимальное. Если вы планируете создавать очень большие таблицы MySQL Cluster (содержащие миллионы строк), вы должны использовать этот параметр, чтобы убедиться, что NDB выделяет достаточное количество слотов индекса в хеш-таблице, используемой для хранения хешей первичных ключей таблицы, установив MAX_ROWS = 2 * rows, где rows — количество строк, которые вы ожидаете вставить в таблицу.

    Максимальное значение MAX_ROWS — 4294967295; значения больше этого будут усечены до этой границы.

END_OF_DOCUMENT_MARKER
  • 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 «Общие табличные пространства».

    Имя tablespace_name — это чувствительное к регистру идентификатор. Он может быть указан в кавычках или без них. Символ слеша (“/”) запрещен. Имена, начинающиеся с “innodb_”, зарезервированы для специального использования.

    Чтобы создать таблицу в системном табличном пространстве, укажите 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, если перед ним не стоит TABLESPACE tablespace_name.

    Для STORAGE MEMORY имя табличного пространства необязательно, поэтому можно использовать TABLESPACE tablespace_name STORAGE MEMORY или просто STORAGE MEMORY, чтобы явно указать, что таблица находится в памяти.

    Дополнительную информацию см. в разделе 25.6.11 «NDB Cluster Disk Data Tables».

  • UNION

    Используется для доступа к набору идентичных 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) )
    );
    
  • PARTITIONS num

    Количество партиций может быть необязательно указано с помощью предложения PARTITIONS num, где num — количество партиций. Если используется как это предложение так и любые предложения 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. Отдельные части, составляющие это предложение, следующие:

    • PARTITION partition_name

      Указывает логическое имя партиции.

    • VALUES

      Для разбиения по диапазонам каждая партиция должна содержать предложение VALUES LESS THAN; для разбиения по списку вы должны указать предложение VALUES IN для каждой партиции. Это используется для определения строк, которые должны храниться в этой партиции. См. обсуждение типов разбиения в главе 26, Разбиение, для примеров синтаксиса.

    • [STORAGE] ENGINE

      MySQL принимает опцию [STORAGE] ENGINE как для PARTITION, так и для SUBPARTITION. В настоящее время этот параметр можно использовать только для установки одинакового хранилища для всех партиций или всех подпартиций, и попытка установить разные хранилища для партиций или подпартиций в одной таблице вызывает ошибку Ошибка 1469 (HY000): Смешение обработчиков в партициях не разрешено в этой версии MySQL.

    • COMMENT

      Необязательное предложение COMMENT можно использовать для указания строки, описывающей партицию. Пример:

      COMMENT = 'Data for the years previous to 1999'
      

      Максимальная длина комментария к партиции составляет 1024 символа.

    • DATA DIRECTORY и INDEX DIRECTORY

      DATA 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 name, где name — идентификатор подпартиции. За исключением замены ключевого слова 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.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/create-table.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API