Spec-Zone.ru › MySQL 8.4

15.1.20 Оператор CREATE TABLE

  • 15.1.20.1 Файлы, создаваемые оператором CREATE TABLE
  • 15.1.20.2 Оператор CREATE TEMPORARY TABLE
  • 15.1.20.3 Оператор CREATE TABLE ... LIKE
  • 15.1.20.4 Оператор CREATE TABLE ... SELECT
  • 15.1.20.5 Ограничения FOREIGN KEY
  • 15.1.20.6 Ограничения CHECK
  • 15.1.20.7 Неявные изменения спецификаций столбцов
  • 15.1.20.8 CREATE TABLE и сгенерированные столбцы
  • 15.1.20.9 Вторичные индексы и сгенерированные столбцы
  • 15.1.20.10 Скрытые столбцы
  • 15.1.20.11 Сгенерированные скрытые первичные ключи
  • 15.1.20.12 Установка параметров комментариев NDB
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    (create_definition,...)
    [table_options]
    [partition_options]

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    [(create_definition,...)]
    [table_options]
    [partition_options]
    [IGNORE | REPLACE]
    [AS] query_expression

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    { LIKE old_tbl_name | (LIKE old_tbl_name) }

create_definition: {
    col_name column_definition
  | {INDEX | KEY} [index_name] [index_type] (key_part,...)
      [index_option] ...
  | {FULLTEXT | SPATIAL} [INDEX | KEY] [index_name] (key_part,...)
      [index_option] ...
  | [CONSTRAINT [symbol]] PRIMARY KEY
      [index_type] (key_part,...)
      [index_option] ...
  | [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY]
      [index_name] [index_type] (key_part,...)
      [index_option] ...
  | [CONSTRAINT [symbol]] FOREIGN KEY
      [index_name] (col_name,...)
      reference_definition
  | check_constraint_definition
}

column_definition: {
    data_type [NOT NULL | NULL] [DEFAULT {literal | (expr)} ]
      [VISIBLE | INVISIBLE]
      [AUTO_INCREMENT] [UNIQUE [KEY]] [[PRIMARY] KEY]
      [COMMENT 'string']
      [COLLATE collation_name]
      [COLUMN_FORMAT {FIXED | DYNAMIC | DEFAULT}]
      [ENGINE_ATTRIBUTE [=] 'string']
      [SECONDARY_ENGINE_ATTRIBUTE [=] 'string']
      [STORAGE {DISK | MEMORY}]
      [reference_definition]
      [check_constraint_definition]
  | data_type
      [COLLATE collation_name]
      [GENERATED ALWAYS] AS (expr)
      [VIRTUAL | STORED] [NOT NULL | NULL]
      [VISIBLE | INVISIBLE]
      [UNIQUE [KEY]] [[PRIMARY] KEY]
      [COMMENT 'string']
      [reference_definition]
      [check_constraint_definition]
}

data_type:
    (see Chapter 13, Data Types)

key_part: {col_name [(length)] | (expr)} [ASC | DESC]

index_type:
    USING {BTREE | HASH}

index_option: {
    KEY_BLOCK_SIZE [=] value
  | index_type
  | WITH PARSER parser_name
  | COMMENT 'string'
  | {VISIBLE | INVISIBLE}
  |ENGINE_ATTRIBUTE [=] 'string'
  |SECONDARY_ENGINE_ATTRIBUTE [=] 'string'
}

check_constraint_definition:
    [CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]

reference_definition:
    REFERENCES tbl_name (key_part,...)
      [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
      [ON DELETE reference_option]
      [ON UPDATE reference_option]

reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

table_options:
    table_option [[,] table_option] ...

table_option: {
    AUTOEXTEND_SIZE [=] value
  | AUTO_INCREMENT [=] value
  | AVG_ROW_LENGTH [=] value
  | [DEFAULT] CHARACTER SET [=] charset_name
  | CHECKSUM [=] {0 | 1}
  | [DEFAULT] COLLATE [=] collation_name
  | COMMENT [=] 'string'
  | COMPRESSION [=] {'ZLIB' | 'LZ4' | 'NONE'}
  | CONNECTION [=] 'connect_string'
  | {DATA | INDEX} DIRECTORY [=] 'absolute path to directory'
  | DELAY_KEY_WRITE [=] {0 | 1}
  | ENCRYPTION [=] {'Y' | 'N'}
  | ENGINE [=] engine_name
  | ENGINE_ATTRIBUTE [=] 'string'
  | INSERT_METHOD [=] { NO | FIRST | LAST }
  | KEY_BLOCK_SIZE [=] value
  | MAX_ROWS [=] value
  | MIN_ROWS [=] value
  | PACK_KEYS [=] {0 | 1 | DEFAULT}
  | PASSWORD [=] 'string'
  | ROW_FORMAT [=] {DEFAULT | DYNAMIC | FIXED | COMPRESSED | REDUNDANT | COMPACT}
  | START TRANSACTION
  | SECONDARY_ENGINE_ATTRIBUTE [=] 'string'
  | STATS_AUTO_RECALC [=] {DEFAULT | 0 | 1}
  | STATS_PERSISTENT [=] {DEFAULT | 0 | 1}
  | STATS_SAMPLE_PAGES [=] value
  | tablespace_option
  | UNION [=] (tbl_name[,tbl_name]...)
}

partition_options:
    PARTITION BY
        { [LINEAR] HASH(expr)
        | [LINEAR] KEY [ALGORITHM={1 | 2}] (column_list)
        | RANGE{(expr) | COLUMNS(column_list)}
        | LIST{(expr) | COLUMNS(column_list)} }
    [PARTITIONS num]
    [SUBPARTITION BY
        { [LINEAR] HASH(expr)
        | [LINEAR] KEY [ALGORITHM={1 | 2}] (column_list) }
      [SUBPARTITIONS num]
    ]
    [(partition_definition [, partition_definition] ...)]

partition_definition:
    PARTITION partition_name
        [VALUES
            {LESS THAN {(expr | value_list) | MAXVALUE}
            |
            IN (value_list)}]
        [[STORAGE] ENGINE [=] engine_name]
        [COMMENT [=] 'string' ]
        [DATA DIRECTORY [=] 'data_dir']
        [INDEX DIRECTORY [=] 'index_dir']
        [MAX_ROWS [=] max_number_of_rows]
        [MIN_ROWS [=] min_number_of_rows]
        [TABLESPACE [=] tablespace_name]
        [(subpartition_definition [, subpartition_definition] ...)]

subpartition_definition:
    SUBPARTITION logical_name
        [[STORAGE] ENGINE [=] engine_name]
        [COMMENT [=] 'string' ]
        [DATA DIRECTORY [=] 'data_dir']
        [INDEX DIRECTORY [=] 'index_dir']
        [MAX_ROWS [=] max_number_of_rows]
        [MIN_ROWS [=] min_number_of_rows]
        [TABLESPACE [=] tablespace_name]

tablespace_option:
    TABLESPACE tablespace_name [STORAGE DISK]
  | [TABLESPACE tablespace_name] STORAGE MEMORY

query_expression:
    SELECT ...   (Some valid select or union statement)

CREATE TABLE создаёт таблицу с заданным именем. Вам необходимо иметь привилегию CREATE для данной таблицы.

По умолчанию таблицы создаются в базе данных по умолчанию, используя движок хранения InnoDB. Возникает ошибка, если таблица уже существует, если нет базы данных по умолчанию или если база данных не существует.

В MySQL нет ограничений на количество таблиц. Файловая система может иметь ограничение на количество файлов, представляющих таблицы. Отдельные движки хранения могут накладывать специфичные для движка ограничения. InnoDB допускает до 4 миллиардов таблиц.

Сведения о физическом представлении таблицы см. в разделе 15.1.20.1, «Файлы, создаваемые оператором CREATE TABLE».

Оператор CREATE TABLE имеет несколько аспектов, описанных в следующих разделах этого раздела:

  • Имя таблицы

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

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

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

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

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

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

Имя таблицы

  • tbl_name

    Имя таблицы можно указать как db_name.tbl_name, чтобы создать таблицу в определённой базе данных. Это работает независимо от наличия базы данных по умолчанию, при условии, что база данных существует. При использовании заключённых в кавычки идентификаторов, кавычки должны быть вокруг имени базы данных и имени таблицы отдельно. Например, запишите `mydb`.`mytbl`, а не `mydb.mytbl`.

    Правила допустимых имён таблиц приведены в разделе 11.2, «Имена объектов схемы».

  • IF NOT EXISTS

    Предотвращает возникновение ошибки, если таблица уже существует. Однако нет проверки, что структура существующей таблицы идентична структуре, указанной в операторе CREATE TABLE.

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

Вы можете использовать ключевое слово TEMPORARY при создании таблицы. Таблица TEMPORARY видна только в текущей сессии и автоматически удаляется при закрытии сессии. Более подробная информация в разделе 15.1.20.2, «Оператор CREATE TEMPORARY TABLE».

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

  • LIKE

    Используйте CREATE TABLE ... LIKE для создания пустой таблицы на основе определения другой таблицы, включая любые атрибуты столбцов и индексы, определённые в исходной таблице:

    CREATE TABLE new_tbl LIKE orig_tbl;
    

    Более подробная информация в разделе 15.1.20.3, «Оператор CREATE TABLE ... LIKE».

  • [AS] query_expression

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

    CREATE TABLE new_tbl AS SELECT * FROM orig_tbl;
    

    Более подробная информация в разделе 15.1.20.4, «Оператор CREATE TABLE ... SELECT».

  • IGNORE | REPLACE

    Параметры IGNORE и REPLACE указывают, как обрабатывать строки, которые дублируют значения уникального ключа при копировании таблицы с помощью оператора SELECT.

    Более подробная информация в разделе 15.1.20.4, «Оператор CREATE TABLE ... SELECT».

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

Существует жёсткое ограничение в 4096 столбцов на таблицу, но фактический максимум может быть меньше для данной таблицы и зависит от факторов, обсуждаемых в разделе 10.4.7, «Ограничения на количество столбцов таблицы и размер строки».

  • data_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 8.4 интерпретирует спецификации длины в определениях столбцов символьных данных в символах. Длины для BINARY и VARBINARY указаны в байтах.

    • Для столбцов CHAR, VARCHAR, BINARY и VARBINARY могут быть созданы индексы, использующие только начальную часть значений столбцов, используя синтаксис col_name(length) для указания длины префикса индекса. Столбцы BLOB и TEXT также могут быть проиндексированы, но должна быть задана длина префикса. Длины префиксов задаются в символах для небинарных строковых типов и в байтах для бинарных строковых типов. То есть записи индекса состоят из первых length символов каждого значения столбца для столбцов CHAR, VARCHAR и TEXT, и первых length байт каждого значения столбца для столбцов BINARY, VARBINARY и BLOB. Индексация только префикса значений столбцов таким образом может значительно уменьшить размер файла индекса. Дополнительную информацию об индексах-префиксах см. в разделе 15.1.15, «Запрос CREATE INDEX».

      Только хранилища данных InnoDB и MyISAM поддерживают индексацию столбцов BLOB и TEXT. Например:

      CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
      

      Если заданный префикс индекса превышает максимальный размер типа данных столбца, CREATE TABLE обрабатывает индекс следующим образом:

      • Для неуникального индекса либо возникает ошибка (если включен строгий режим SQL), либо длина индекса уменьшается до попадания в пределы максимального размера типа данных столбца, и выводится предупреждение (если строгий режим SQL не включен).

      • Для уникального индекса возникает ошибка независимо от режима SQL, потому что уменьшение длины индекса может привести к возможности вставки не уникальных записей, которые не соответствуют требованиям уникальности.

    • Столбцы JSON не могут быть индексированы. Можно обойти это ограничение, создав индекс на вычисляемом столбце, который извлекает скалярное значение из столбца JSON. См. Индексация вычисляемого столбца для предоставления индекса столбца JSON для подробного примера.

  • NOT NULL | NULL

    Если не указаны ни NULL, ни NOT NULL, столбец обрабатывается так, как будто указано NULL.

    В MySQL 8.4 только хранилища данных InnoDB, MyISAM и MEMORY поддерживают индексы на столбцах, которые могут иметь значения NULL. В других случаях вы должны объявить индексируемые столбцы как NOT NULL, в противном случае произойдет ошибка.

  • DEFAULT

    Указывает значение по умолчанию для столбца. Дополнительную информацию об обработке значений по умолчанию, в том числе случай, когда в определении столбца нет явного значения DEFAULT, см. в разделе 13.6, «Значения по умолчанию типов данных».

    Если включен режим SQL NO_ZERO_DATE или NO_ZERO_IN_DATE и значение даты по умолчанию не соответствует этому режиму, CREATE TABLE выдает предупреждение, если строгий режим SQL не включен, и ошибку, если включен. Например, при включенном NO_ZERO_IN_DATE, c1 DATE DEFAULT '2010-00-00' выведет предупреждение.

  • VISIBLE, INVISIBLE

    Указывают видимость столбца. По умолчанию это VISIBLE, если ни один из ключевых слов не указан. Таблица должна иметь хотя бы один видимый столбец. Попытка сделать все столбцы невидимыми приведет к ошибке. Дополнительную информацию см. в разделе 15.1.20.10, «Невидимые столбцы».

  • AUTO_INCREMENT

    Целочисленный столбец может иметь дополнительный атрибут AUTO_INCREMENT. При вставке значения NULL (рекомендуется) или 0 в индексированный столбец AUTO_INCREMENT, столбец устанавливается на следующее значение последовательности. Обычно это value+1, где value — наибольшее значение для столбца в таблице в данный момент. Последовательности AUTO_INCREMENT начинаются с 1.

    Чтобы получить значение AUTO_INCREMENT после вставки строки, используйте функцию SQL LAST_INSERT_ID() или функцию C API. См. раздел 14.15, «Информационные функции» и .

    Если включен режим SQL NO_AUTO_VALUE_ON_ZERO, можно сохранить 0 в столбцах AUTO_INCREMENT как 0 без генерации нового значения последовательности. См. раздел 7.1.11, «Режимы SQL сервера».

    В таблице может быть только один столбец AUTO_INCREMENT, он должен быть индексирован и не может иметь значения DEFAULT. Столбец AUTO_INCREMENT работает правильно только если содержит только положительные значения. Вставка отрицательного числа рассматривается как вставка очень большого положительного числа. Это сделано для предотвращения проблем с точностью при «переходе» чисел из положительных в отрицательные, а также для обеспечения того, что вы случайно не получите столбец AUTO_INCREMENT, содержащий 0.

    Для таблиц MyISAM можно указать вторичный столбец AUTO_INCREMENT в ключе из нескольких столбцов. См. раздел 5.6.9, «Использование AUTO_INCREMENT».

    Для совместимости MySQL с некоторыми приложениями ODBC можно найти значение AUTO_INCREMENT для последней вставленной строки с помощью следующего запроса:

    SELECT * FROM tbl_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 8.4 игнорирует COLUMN_FORMAT без ошибок.

  • Параметры ENGINE_ATTRIBUTE и SECONDARY_ENGINE_ATTRIBUTE используются для указания атрибутов столбцов для первичных и вторичных движков хранения. Параметры зарезервированы для будущего использования.

    Присвоенное значение — строковая константа, содержащая допустимый JSON-документ или пустую строку (''). Недопустимый JSON отклоняется.

    CREATE TABLE t1 (c1 INT ENGINE_ATTRIBUTE='{"key":"value"}');
    

    Значения ENGINE_ATTRIBUTE и SECONDARY_ENGINE_ATTRIBUTE могут быть повторены без ошибок. В этом случае используется последнее заданное значение.

    Значения ENGINE_ATTRIBUTE и SECONDARY_ENGINE_ATTRIBUTE не проверяются сервером и не очищаются при изменении движка хранения таблицы.

  • STORAGE

    Для таблиц NDB можно указать, хранится ли столбец на диске или в памяти, используя предложение STORAGE. STORAGE DISK заставляет хранить столбец на диске, а STORAGE MEMORY — использовать хранение в памяти. Команда CREATE TABLE, которая используется, должна все равно содержать предложение TABLESPACE:

    mysql> CREATE TABLE t1 (
        ->     c1 INT STORAGE DISK,
        ->     c2 INT STORAGE MEMORY
        -> ) ENGINE NDB;
    ERROR 1005 (HY000): Can't create table 'c.t1' (errno: 140)
    
    mysql> CREATE TABLE t1 (
        ->     c1 INT STORAGE DISK,
        ->     c2 INT STORAGE MEMORY
        -> ) TABLESPACE ts_1 ENGINE NDB;
    Query OK, 0 rows affected (1.06 sec)
    

    Для таблиц NDB, STORAGE DEFAULT эквивалентно STORAGE MEMORY.

    Предложение STORAGE не влияет на таблицы, использующие движки хранения, отличные от NDB. Ключевое слово STORAGE поддерживается только в сборке mysqld, поставляемой с NDB Cluster; в других версиях MySQL оно не распознается, и любая попытка использовать ключевое слово STORAGE вызовет синтаксическую ошибку.

  • GENERATED ALWAYS

    Используется для указания выражения сгенерированного столбца. Для получения информации, см. раздел 15.1.20.8, «CREATE TABLE и сгенерированные столбцы».

    могут быть индексированы. InnoDB поддерживает вторичные индексы на . См. раздел 15.1.20.9, «Вторичные индексы и сгенерированные столбцы».

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

Несколько ключевых слов применяются к созданию индексов, внешних ключей и ограничений CHECK. Для общего контекста помимо следующих описаний, см. раздел 15.1.15, «CREATE INDEX Statement», раздел 15.1.20.5, «Ограничения FOREIGN KEY» и раздел 15.1.20.6, «Ограничения CHECK».

  • 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.23, «Оператор 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.20.6, «Ограничения CHECK».

  • key_part

    • Спецификация key_part может завершаться ASC или DESC, чтобы указать, хранятся ли значения индексов в порядке возрастания или убывания. По умолчанию используется возрастающий порядок, если указатель порядка не задан.

    • Префиксы, определенные атрибутом length, могут иметь длину до 767 байтов для таблиц InnoDB, использующих формат строк или . Предел длины префикса составляет 3072 байта для таблиц InnoDB, использующих формат строк или . Для таблиц MyISAM предел длины префикса составляет 1000 байтов.

      Длина префикса измеряется в байтах. Однако длина префикса для спецификаций индексов в операторах CREATE TABLE, ALTER TABLE и CREATE INDEX интерпретируется как число символов для типов строковых данных без бинарного представления (CHAR, VARCHAR, TEXT) и число байтов для типов строковых данных с бинарным представлением (BINARY, VARBINARY, BLOB). Учитывайте это при указании длины префикса для столбца строковых данных без бинарного представления, использующего многобайтовую кодировку.

    • Значение expr для спецификации key_part может принимать вид (CAST json_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.20.5, «Ограничения FOREIGN KEY».

    Таблицы InnoDB и NDB поддерживают проверку ограничений внешнего ключа. Столбцы таблицы-получателя должны всегда быть явно указаны. Поддерживаются как действия ON DELETE, так и ON UPDATE над внешними ключами. Дополнительную информацию и примеры см. в Разделе 15.1.20.5, «Ограничения FOREIGN KEY».

    Для других движков хранения MySQL Server анализирует и игнорирует синтаксис FOREIGN KEY в операторах CREATE TABLE.

    Важно

    Для пользователей, знакомых со стандартом ANSI/ISO SQL, обратите внимание, что ни один движок хранения, включая InnoDB, не распознает или не выполняет проверку предложения MATCH, используемого в определениях ограничений целостности данных. Использование явного предложения MATCH не имеет ожидаемого эффекта и приводит к игнорированию предложений ON DELETE и ON UPDATE. По этим причинам следует избегать указания MATCH.

    Предложение MATCH в стандарте SQL управляет обработкой значений NULL в составном (многостолбцовом) внешнем ключе при сравнении с первичным ключом. InnoDB фактически реализует семантику, определенную MATCH SIMPLE, которая позволяет внешнему ключу быть полностью или частично NULL. В этом случае строка (в дочерней таблице), содержащая такой внешний ключ, может быть вставлена и не совпадает ни с одной строкой в таблице-получателе (родительской таблице). Другие семантики могут быть реализованы с помощью триггеров.

    Кроме того, MySQL требует, чтобы столбцы-получатели были индексированы для повышения производительности. Однако, InnoDB не накладывает требования, что столбцы-получатели должны быть объявлены UNIQUE или NOT NULL. Обработка ссылок внешних ключей на не уникальные ключи или ключи, содержащие NULL значения, не определена для операций, таких как UPDATE или DELETE CASCADE. Рекомендуется использовать внешние ключи, ссылающиеся только на ключи, которые являются как UNIQUE (или PRIMARY), так и NOT NULL.

    MySQL анализирует, но игнорирует “встроенные REFERENCES спецификации” (как определено в стандарте SQL), где ссылки определяются как часть спецификации столбца. MySQL принимает предложения REFERENCES только в качестве части отдельной спецификации FOREIGN KEY. Дополнительную информацию см. в Разделе 1.7.2.3, «Различия в ограничениях FOREIGN KEY».

  • reference_option

    Дополнительную информацию об опциях RESTRICT, CASCADE, SET NULL, NO ACTION и SET DEFAULT см. в Разделе 15.1.20.5, «Ограничения FOREIGN KEY».

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

Параметры таблицы используются для оптимизации поведения таблицы. В большинстве случаев, их указывать не нужно. Эти параметры применяются ко всем движкам хранения, если не указано иное. Параметры, не применяемые к определенному движку хранения, могут приниматься и запоминаться как часть определения таблицы. Эти параметры применяются, если вы позже используете ALTER TABLE для преобразования таблицы с использованием другого движка хранения.

  • ENGINE

    Указывает движок хранения для таблицы, используя одно из имен, представленных в следующей таблице. Имя движка может быть не заключено в кавычки или заключено в кавычки. Имя в кавычках 'DEFAULT' распознается, но игнорируется.

    Движок хранения Описание
    InnoDB Транзакционно-безопасные таблицы с блокировкой строк и внешними ключами. По умолчанию используется для новых таблиц. Смотрите Главу 17, Движок хранения InnoDB, а именно Раздел 17.1, «Введение в InnoDB», если у вас есть опыт работы с MySQL, но вы новичок в InnoDB.
    MyISAM Двоичный переносимый движок хранения, который в основном используется для чтений или преимущественно для чтений. Смотрите Раздел 18.2, «Движок хранения MyISAM».
    MEMORY Данные для этого движка хранения хранятся только в оперативной памяти. Смотрите Раздел 18.3, «Движок хранения MEMORY».
    CSV Таблицы, которые хранят строки в формате значений, разделенных запятыми. Смотрите Раздел 18.4, «Движок хранения CSV».
    ARCHIVE Движок хранения для архивирования. Смотрите Раздел 18.5, «Движок хранения ARCHIVE».
    EXAMPLE Примерный движок. Смотрите Раздел 18.9, «Движок хранения EXAMPLE».
    FEDERATED Движок хранения, который обращается к удаленным таблицам. Смотрите Раздел 18.8, «Движок хранения FEDERATED».
    HEAP Это синоним для MEMORY.
    MERGE Коллекция MyISAM таблиц, используемых как одна таблица. Также известен как MRG_MyISAM. Смотрите Раздел 18.7, «Движок хранения MERGE».
    NDB Кластеризованные, отказоустойчивые, основанные на памяти таблицы, поддерживающие транзакции и внешние ключи. Также известны как NDBCLUSTER. Смотрите Главу 25, MySQL NDB Cluster 8.4.

    По умолчанию, если указан движок хранения, который недоступен, оператор завершается с ошибкой. Вы можете изменить это поведение, удалив NO_ENGINE_SUBSTITUTION из серверных SQL-режимов (см. Раздел 7.1.11, «Серверные SQL-режимы»), чтобы MySQL разрешал замену указанного движка на движок хранения по умолчанию. В таких случаях обычно используется InnoDB, что является значением по умолчанию для переменной системы default_storage_engine. Когда NO_ENGINE_SUBSTITUTION отключен, при неудовлетворении спецификации движка хранения появляется предупреждение.

  • AUTOEXTEND_SIZE

    Определяет величину, на которую InnoDB увеличивает размер табличного пространства, когда оно заполняется. Значение должно быть кратно 4 МБ. Значение по умолчанию - 0, что приводит к расширению табличного пространства в соответствии с неявным поведением по умолчанию. Подробности см. в Разделе 17.6.3.9, «Конфигурация AUTOEXTEND_SIZE табличного пространства».

  • AUTO_INCREMENT

    Начальное значение AUTO_INCREMENT для таблицы. В MySQL 8.4 это работает для MyISAM, MEMORY, InnoDB и ARCHIVE таблиц. Чтобы установить первое значение автоинкремента для движков, которые не поддерживают AUTO_INCREMENT параметр таблицы, вставьте строку “dummy” со значением на единицу меньше желаемого значения после создания таблицы, а затем удалите строку dummy.

    Для движков, которые поддерживают параметр таблицы AUTO_INCREMENT в операторах CREATE TABLE, вы также можете использовать ALTER TABLE tbl_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 TABLES.

    Этот синтаксис комментариев также поддерживается операторами ALTER TABLE для NDB таблиц. Имейте в виду, что комментарий к таблице, используемый с ALTER TABLE, заменяет любой существующий комментарий, который могла иметь таблица ранее.

    Установка параметра MERGE_THRESHOLD в комментариях к таблицам не поддерживается для NDB таблиц (он игнорируется).

    Для получения полной информации о синтаксисе и примерах см. Раздел 15.1.20.12, «Настройка параметров NDB Comment».

  • COMPRESSION

    Алгоритм сжатия, используемый для сжатия страниц на уровне страницы для InnoDB таблиц. Поддерживаемые значения включают Zlib, LZ4 и None. Атрибут COMPRESSION был введён с прозрачным сжатием страниц. Сжатие страниц поддерживается только для InnoDB таблиц, находящихся в табличных пространствах, и доступно только на платформах Linux и Windows, поддерживающих разреженные файлы и пробивку отверстий. Подробности см. в Разделе 17.9.2, «Сжатие страниц InnoDB».

  • CONNECTION

    Строка подключения для FEDERATED таблицы.

    Примечание

    Более ранние версии MySQL использовали параметр COMMENT для строки подключения.

  • DATA DIRECTORY, INDEX DIRECTORY

    Для InnoDB, клаузула DATA DIRECTORY='directory' разрешает создание таблиц вне каталога данных. Для использования клаузулы DATA DIRECTORY необходимо включить переменную innodb_file_per_table. Полный путь к каталогу должен быть указан и известен InnoDB. Дополнительную информацию см. в разделе 17.6.1.2, «Создание таблиц в формате внешнего хранилища».

    При создании MyISAM таблиц, можно использовать клаузулу DATA DIRECTORY='directory', клаузулу INDEX DIRECTORY='directory' или обе. Они указывают, соответственно, место размещения файла данных и файла индексов для таблицы MyISAM. В отличие от InnoDB таблиц, MySQL не создает подкаталоги, соответствующие имени базы данных, при создании MyISAM таблицы с опциями DATA DIRECTORY или INDEX DIRECTORY. Файлы создаются в указанном каталоге.

    Для использования опций DATA DIRECTORY или INDEX DIRECTORY таблицы необходимо иметь привилегию FILE.

    Важно

    Опции уровня таблицы DATA DIRECTORY и INDEX DIRECTORY игнорируются для разнесенных таблиц. (Ошибка #32091)

    Эти опции работают только тогда, когда вы не используете опцию --skip-symbolic-links. Ваша операционная система также должна иметь рабочую, потокобезопасную функцию realpath(). Более подробную информацию см. в разделе 10.12.2.2, «Использование символических ссылок для MyISAM таблиц в Unix».

    Если MyISAM таблица создается без опции DATA DIRECTORY, файл .MYD создаётся в каталоге базы данных. По умолчанию, если MyISAM находит существующий файл .MYD в этом случае, он перезаписывает его. То же самое относится к файлам .MYI для таблиц, созданных без опции INDEX DIRECTORY. Чтобы подавить это поведение, запустите сервер с опцией --keep_files_on_create, в этом случае MyISAM не перезаписывает существующие файлы и вместо этого возвращает ошибку.

    Если MyISAM таблица создается с опцией DATA DIRECTORY или INDEX DIRECTORY, и находится существующий файл .MYD или .MYI, MyISAM всегда возвращает ошибку и не перезаписывает файл в указанном каталоге.

    Важно

    Вы не можете использовать пути, содержащие каталог данных MySQL с DATA DIRECTORY или INDEX DIRECTORY. Это относится к разнесенным таблицам и отдельным разделам таблиц. (См. ошибку #32167.)

  • DELAY_KEY_WRITE

    Установите значение 1, если вы хотите отложить обновление ключей для таблицы до закрытия таблицы. См. описание системной переменной delay_key_write в разделе 7.1.8, «Системные переменные сервера». (MyISAM только.)

  • ENCRYPTION

    Клаузула ENCRYPTION включает или отключает шифрование данных на уровне страниц для InnoDB таблицы. Для включения шифрования необходимо установить и настроить плагин хранилища ключей. Клаузула ENCRYPTION может быть указана при создании таблицы в табличном пространстве по отдельным файлам или при создании таблицы в общем табличном пространстве.

    Опция ENCRYPTION поддерживается только хранилищем данных InnoDB; поэтому она работает только если движок по умолчанию — InnoDB, или если оператор CREATE TABLE также указывает ENGINE=InnoDB. В противном случае оператор отклоняется с сообщением о...

    Таблица наследует шифрование схемы по умолчанию, если клаузула ENCRYPTION не указана. Если переменная table_encryption_privilege_check включена, для создания таблицы с клаузулой ENCRYPTION, значение которой отличается от шифрования схемы по умолчанию, требуется привилегия TABLE_ENCRYPTION_ADMIN. При создании таблицы в общем табличном пространстве шифрование таблицы и табличного пространства должно совпадать.

    Указание клаузулы ENCRYPTION со значением, отличным от 'N' или '', запрещено при использовании движка хранилища данных, не поддерживающего шифрование.

    Для получения дополнительной информации см. раздел 17.13, «Шифрование данных InnoDB при хранении на диске».

  • Опции ENGINE_ATTRIBUTE и SECONDARY_ENGINE_ATTRIBUTE используются для указания атрибутов таблицы для первичных и вторичных движков хранилища. Опции зарезервированы для будущего использования.

    Присвоенное значение любой из этих опций должно быть строковым литералом, содержащим допустимый JSON-документ или пустой строкой (''). Недопустимый JSON отклоняется.

    CREATE TABLE t1 (c1 INT) ENGINE_ATTRIBUTE='{"key":"value"}';
    

    Значения ENGINE_ATTRIBUTE и SECONDARY_ENGINE_ATTRIBUTE могут быть повторены без ошибок. В этом случае используется последнее указанное значение.

    Значения ENGINE_ATTRIBUTE и SECONDARY_ENGINE_ATTRIBUTE не проверяются сервером и не очищаются при изменении движка хранилища данных таблицы.

  • INSERT_METHOD

    Если вы хотите вставить данные в MERGE таблицу, вы должны указать с помощью INSERT_METHOD таблицу, в которую должна быть вставлена строка. INSERT_METHOD — опция, полезная только для MERGE таблиц. Используйте значение FIRST или LAST, чтобы вставки направлялись в первую или последнюю таблицу, или значение NO, чтобы предотвратить вставки. См. раздел 18.7, «Движок хранилища данных MERGE».

  • KEY_BLOCK_SIZE

    Для таблиц MyISAM, KEY_BLOCK_SIZE необязательно указывает размер в байтах, который следует использовать для блоков ключей индекса. Значение обрабатывается как подсказка; при необходимости может быть использован другой размер. Значение KEY_BLOCK_SIZE, указанное для отдельного определения индекса, переопределяет значение KEY_BLOCK_SIZE уровня таблицы.

    Для таблиц InnoDB, KEY_BLOCK_SIZE указывает размер в килобайтах, который следует использовать для InnoDB таблиц. Значение KEY_BLOCK_SIZE обрабатывается как подсказка; при необходимости может быть использован другой размер, подбираемый InnoDB. Значение KEY_BLOCK_SIZE должно быть меньше или равно значению innodb_page_size. Значение 0 соответствует размеру страницы сжатия по умолчанию, которое составляет половину значения innodb_page_size. В зависимости от innodb_page_size, возможные значения KEY_BLOCK_SIZE включают 0, 1, 2, 4, 8 и 16. Более подробную информацию см. в разделе 17.9.1, «Сжатие таблиц InnoDB».

    Oracle рекомендует включить innodb_strict_mode при указании KEY_BLOCK_SIZE для InnoDB таблиц. При включенном innodb_strict_mode использование недопустимого значения KEY_BLOCK_SIZE приводит к ошибке. Если innodb_strict_mode отключен, недопустимое значение KEY_BLOCK_SIZE приводит к предупреждению, и опция KEY_BLOCK_SIZE игнорируется.

    Столбец Create_options в ответ на SHOW TABLE STATUS сообщает об фактически используемом KEY_BLOCK_SIZE размером таблицы, как и SHOW CREATE TABLE.

    InnoDB поддерживает KEY_BLOCK_SIZE только на уровне таблицы.

    KEY_BLOCK_SIZE не поддерживается со значениями innodb_page_size 32КБ и 64КБ. InnoDB сжатие таблиц не поддерживает эти размеры страниц.

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

  • MAX_ROWS

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

    Важно

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

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

    Максимальное значение MAX_ROWS равно 4294967295; значения больше этого предела усекаются до этого значения.

  • MIN_ROWS

    Минимальное количество строк, которые планируется хранить в таблице. Справочный механизм хранения MEMORY использует этот параметр в качестве подсказки об использовании памяти.

  • PACK_KEYS

    Действует только для таблиц MyISAM. Установите этот параметр в 1, если хотите иметь меньшие индексы. Обычно это замедляет обновления и ускоряет чтение. Установка параметра в 0 отключает все упаковывание ключей. Установка в DEFAULT указывает хранилищу данных на упаковку только длинных CHAR, VARCHAR, BINARY или VARBINARY столбцов.

    Если вы не используете PACK_KEYS, по умолчанию строки упаковываются, но не числа. Если вы используете PACK_KEYS=1, числа также упаковываются.

    При упаковке двоичных числовых ключей MySQL использует сжатие префикса:

    • Каждый ключ нуждается в одном дополнительном байте, чтобы указать, сколько байтов предыдущего ключа совпадает с последующим ключом.

    • Указатель на строку хранится в формате с старшими байтами непосредственно после ключа, чтобы улучшить сжатие.

    Это означает, что если у вас много одинаковых ключей в двух последовательных строках, все последующие “одинаковые” ключи обычно занимают всего два байта (включая указатель на строку). Сравните это со стандартным случаем, где последующие ключи занимают storage_size_for_key + pointer_size (где размер указателя обычно составляет 4). Напротив, значительная выгода от сжатия префикса наблюдается только при наличии большого количества одинаковых чисел. Если все ключи уникальны, вы используете на один байт больше на ключ, если ключ не содержит NULL значений. (В этом случае длина упакованного ключа хранится в том же байте, который используется для маркировки, является ли ключ NULL).

  • PASSWORD

    Этот параметр не используется.

  • ROW_FORMAT

    Определяет физический формат, в котором хранятся строки.

    При создании таблицы с отключенным, используется форма строки по умолчанию для хранилища данных, если заданный формат строки не поддерживается. Фактический формат строки таблицы сообщается в столбце Row_format в ответ на SHOW TABLE STATUS. Столбец Create_options отображает формат строки, указанный в CREATE TABLE команде, а также в SHOW CREATE TABLE.

    Варианты формата строк отличаются в зависимости от хранилища данных, используемого для таблицы.

    Для таблиц InnoDB:

    • Формат строки по умолчанию определяется параметром innodb_default_row_format, который имеет значение по умолчанию DYNAMIC. Формат строки по умолчанию используется, когда параметр ROW_FORMAT не задан или когда используется ROW_FORMAT=DEFAULT.

      Если параметр ROW_FORMAT не задан или используется ROW_FORMAT=DEFAULT, операции, которые перестраивают таблицу, также незаметно изменяют формат строки таблицы на формат по умолчанию, определяемый параметром innodb_default_row_format. Дополнительную информацию см. в разделе Определении формата строк таблицы.

    • Для более эффективного хранения типов данных, особенно типов BLOB, используйте формат DYNAMIC. Требования, связанные с форматом строк DYNAMIC, см. в разделе DYNAMIC Row Format.

    • Чтобы включить сжатие для таблиц InnoDB, укажите ROW_FORMAT=COMPRESSED. Параметр ROW_FORMAT=COMPRESSED не поддерживается при создании временных таблиц. Требования, связанные с форматом строк COMPRESSED, см. в разделе Раздел 17.9, «Сжатие таблиц и страниц InnoDB».

    • Формат строки, используемый в более ранних версиях MySQL, все еще может быть запрошен, указав формат строк REDUNDANT.

    • При указании необязательного значения ROW_FORMAT, также рассмотрите возможность включения параметра конфигурации innodb_strict_mode.

    • ROW_FORMAT=FIXED не поддерживается. Если ROW_FORMAT=FIXED указано, а innodb_strict_mode отключено, InnoDB выводит предупреждение и предполагает ROW_FORMAT=DYNAMIC. Если ROW_FORMAT=FIXED указано, а innodb_strict_mode включено (по умолчанию), InnoDB возвращает ошибку.

    • Дополнительную информацию о форматах строк InnoDB см. в разделе Раздел 17.10, «Форматы строк InnoDB».

    Для таблиц MyISAM значение параметра может быть FIXED или DYNAMIC для статического или динамического формата строки. myisampack устанавливает тип в COMPRESSED. См. раздел Раздел 18.2.3, «Форматы хранения таблиц MyISAM».

    Для таблиц NDB значение параметра ROW_FORMAT по умолчанию равно DYNAMIC.

  • START TRANSACTION

    Это параметр таблицы для внутреннего использования, позволяющий CREATE TABLE ... SELECT регистрироваться как единая атомная транзакция в двоичном журнале при использовании репликации на основе строк с хранилищем данных, поддерживающим атомные DDL. Только BINLOG, COMMIT и ROLLBACK операторы разрешены после CREATE TABLE ... START TRANSACTION. Подробную информацию см. в разделе Раздел 15.1.1, «Поддержка атомных операторов определения данных».

  • STATS_AUTO_RECALC

    Указывает, следует ли автоматически пересчитывать статистику для таблицы InnoDB. Значение DEFAULT позволяет определить постоянные параметры статистики таблицы параметром конфигурации innodb_stats_auto_recalc. Значение 1 приводит к пересчету статистики, когда 10% данных в таблице изменились. Значение 0 предотвращает автоматический пересчет для этой таблицы; в этом случае выполните оператор ANALYZE TABLE для пересчета статистики после существенных изменений в таблице. Дополнительную информацию о функции постоянной статистики см. в разделе Раздел 17.8.10.1, «Настройка параметров постоянной статистики оптимизатора».

  • STATS_PERSISTENT

    Указывает, следует ли включить постоянные статистические данные для таблицы InnoDB. Значение DEFAULT позволяет определить постоянные параметры статистики таблицы параметром конфигурации innodb_stats_persistent. Значение 1 включает постоянную статистику для таблицы, а значение 0 выключает эту функцию. После включения постоянной статистики с помощью команды CREATE TABLE или ALTER TABLE выполните оператор ANALYZE TABLE для расчета статистики после загрузки репрезентативных данных в таблицу. Дополнительную информацию о функции постоянной статистики см. в разделе Раздел 17.8.10.1, «Настройка параметров постоянной статистики оптимизатора».

  • STATS_SAMPLE_PAGES

    Количество страниц индекса для выборки при оценке кардинальности и других статистических данных для индексированного столбца, таких как те, которые вычисляет оператор ANALYZE TABLE. Дополнительную информацию см. в разделе Раздел 17.8.10.1, «Настройка параметров постоянной статистики оптимизатора».

  • TABLESPACE

    Оператор TABLESPACE может использоваться для создания таблицы InnoDB в существующем общем табличном пространстве, табличном пространстве с файлом на таблицу или системном табличном пространстве.

    CREATE TABLE tbl_name ... TABLESPACE [=] tablespace_name

    Указанное вами общее табличное пространство должно существовать до использования оператора TABLESPACE. Сведения о общих табличных пространствах см. в разделе 17.6.3.3, «Общие табличные пространства».

    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».

  • UNION

    Используется для доступа к набору идентичных MyISAM таблиц как к одной. Это работает только с таблицами MERGE. См. раздел 18.7, «Двигатель MERGE».

    Вы должны иметь права SELECT, UPDATE и DELETE для таблиц, которые вы сопоставляете с таблицей MERGE.

    Примечание

    Раньше все используемые таблицы должны были находиться в той же базе данных, что и сама таблица MERGE. Это ограничение больше не действует.

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

partition_options может использоваться для управления разбиением таблицы, созданной с помощью CREATE TABLE.

Не все опции, показанные в синтаксисе для partition_options в начале этого раздела, доступны для всех типов разбиения. Для получения информации, специфичной для каждого типа, см. соответствующие списки, а также главу 26, Разбиение, для получения более подробной информации о работе и использовании разбиения в MySQL, а также дополнительных примеров создания таблиц и других операторов, относящихся к разбиению MySQL.

Разбиения можно изменять, объединять, добавлять в таблицы и удалять из таблиц. Для получения базовой информации о операторах MySQL для выполнения этих задач см. раздел 15.1.9, «Оператор ALTER TABLE». Для более подробных описаний и примеров см. раздел 26.3, «Управление разбиением».

  • PARTITION BY

    Если используется, раздел partition_options начинается с PARTITION BY. Этот раздел содержит функцию, используемую для определения раздела; функция возвращает целое число от 1 до num, где num — это количество разделов. (Максимальное количество определенных пользователем разделов, которые может содержать таблица, равно 1024; количество подразделов, обсуждаемых позже в этом разделе, включено в это максимальное значение.)

    Примечание

    Выражение (expr), используемое в разделе PARTITION BY, не может ссылаться на столбцы, отсутствующие в создаваемой таблице; такие ссылки запрещены и приводят к ошибке при выполнении запроса. (Ошибка #29444)

  • HASH(expr)

    Хэширует один или несколько столбцов для создания ключа для размещения и поиска строк. expr — это выражение, использующее один или несколько столбцов таблицы. Это может быть любое допустимое выражение MySQL (включая функции MySQL), возвращающее единственное целое значение. Например, следующие операторы CREATE TABLE с использованием PARTITION BY HASH являются допустимыми:

    CREATE TABLE t1 (col1 INT, col2 CHAR(5))
        PARTITION BY HASH(col1);
    
    CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATETIME)
        PARTITION BY HASH ( YEAR(col3) );
    

    Нельзя использовать разделы VALUES LESS THAN или VALUES IN с PARTITION BY HASH.

    PARTITION BY HASH использует остаток от деления expr на количество разделов (то есть модуль). Примеры и дополнительная информация см. в разделе 26.2.4 «HASH Partitioning».

    Ключевое слово LINEAR предполагает несколько другой алгоритм. В этом случае номер раздела, в котором хранится строка, вычисляется как результат одной или нескольких логических операций AND. Обсуждение и примеры линейного хэширования см. в разделе 26.2.4.1 «LINEAR HASH Partitioning».

  • KEY(column_list)

    Это аналогично HASH, за исключением того, что MySQL предоставляет функцию хэширования, чтобы гарантировать равномерное распределение данных. Аргумент column_list представляет собой просто список из 1 или более столбцов таблицы (максимум: 16). Этот пример демонстрирует простую таблицу, разделяемую по ключу, с 4 разделами:

    CREATE TABLE tk (col1 INT, col2 CHAR(5), col3 DATE)
        PARTITION BY KEY(col3)
        PARTITIONS 4;
    

    Для таблиц, разделяемых по ключу, можно использовать линейное разделение, используя ключевое слово LINEAR. Это имеет тот же эффект, что и при разделении таблиц по HASH. То есть номер раздела находится с использованием оператора &, а не модуля (см. раздел 26.2.4.1 «LINEAR HASH Partitioning» и раздел 26.2.5 «KEY Partitioning» для получения подробностей). Этот пример использует линейное разделение по ключу для распределения данных между 5 разделами:

    CREATE TABLE tk (col1 INT, col2 CHAR(5), col3 DATE)
        PARTITION BY LINEAR KEY(col3)
        PARTITIONS 5;
    

    Опция ALGORITHM={1 | 2} поддерживается с [SUB]PARTITION BY [LINEAR] KEY. ALGORITHM=1 заставляет сервер использовать те же функции хэширования ключей, что и MySQL 5.1; ALGORITHM=2 означает, что сервер использует функции хэширования ключей, реализованные и используемые по умолчанию для новых KEY разделяемых таблиц в MySQL 5.5 и более поздних версиях. (Разделяемые таблицы, созданные с использованием функций хэширования ключей, применяемых в MySQL 5.5 и более поздних версиях, не могут использоваться сервером MySQL 5.1.) Отсутствие указания опции имеет тот же эффект, что и использование ALGORITHM=2. Эта опция предназначена в основном для использования при обновлении или понижении версий [LINEAR] KEY разделяемых таблиц между MySQL 5.1 и более поздними версиями MySQL, или для создания таблиц, разделенных по KEY или LINEAR KEY на сервере MySQL 5.5 или более поздней версии, которые можно использовать на сервере MySQL 5.1. Более подробная информация приведена в разделе 15.1.9.1 «ALTER TABLE Partition Operations».

    mysqldump записывает эту опцию в комментариях с указанием версии.

    ALGORITHM=1 отображается при необходимости в выходных данных SHOW CREATE TABLE с использованием комментариев с указанием версии аналогично mysqldump. ALGORITHM=2 всегда опускается из выходных данных SHOW CREATE TABLE, даже если эта опция была указана при создании исходной таблицы.

    Нельзя использовать разделы VALUES LESS THAN или VALUES IN с PARTITION BY KEY.

  • RANGE(expr)

    В этом случае expr отображает диапазон значений с помощью набора операторов VALUES LESS THAN. При использовании разбиения по диапазону необходимо определить как минимум один раздел с помощью VALUES LESS THAN. Нельзя использовать VALUES IN с разбиением по диапазону.

    Примечание

    Для таблиц, разделенных по RANGE, необходимо использовать VALUES LESS THAN с целочисленной литерой или выражением, которое вычисляется в целое число. В MySQL 8.4 можно преодолеть это ограничение в таблице, определенной с помощью PARTITION BY RANGE COLUMNS, как описано позже в этом разделе.

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

    Номер раздела: Диапазон лет:
    0 1990 и ранее
    1 1991 по 1994
    2 1995 по 1998
    3 1999 по 2002
    4 2003 по 2005
    5 2006 и позже

    Таблицу с такой схемой разбиения можно создать оператором CREATE TABLE, показанным здесь:

    CREATE TABLE t1 (
        year_col  INT,
        some_data INT
    )
    PARTITION BY RANGE (year_col) (
        PARTITION p0 VALUES LESS THAN (1991),
        PARTITION p1 VALUES LESS THAN (1995),
        PARTITION p2 VALUES LESS THAN (1999),
        PARTITION p3 VALUES LESS THAN (2002),
        PARTITION p4 VALUES LESS THAN (2006),
        PARTITION p5 VALUES LESS THAN MAXVALUE
    );
    

    Операторы PARTITION ... VALUES LESS THAN ... работают последовательно. VALUES LESS THAN MAXVALUE используется для указания “оставшихся” значений, которые больше максимального значения, указанного иначе.

    Разделы VALUES LESS THAN работают последовательно, аналогично разделам case блока switch ... case (как в многих языках программирования, таких как C, Java и PHP). То есть разделы должны быть упорядочены таким образом, чтобы верхняя граница, указанная в каждом последующем VALUES LESS THAN, была больше, чем предыдущая, и раздел, ссылающийся на MAXVALUE, должен быть последним в списке.

  • RANGE COLUMNS(column_list)

    Этот вариант RANGE позволяет выполнять сокращение разделов для запросов, использующих условия диапазона по нескольким столбцам (то есть имеющих условия, такие как WHERE a = 1 AND b < 10 или WHERE a = 1 AND b = 10 AND c < 10). Он позволяет указать диапазоны значений в нескольких столбцах, используя список столбцов в разделе COLUMNS и набор значений столбцов в каждом разделе PARTITION ... VALUES LESS THAN (value_list). (В простейшем случае этот набор состоит из одного столбца.) Максимальное количество столбцов, которые могут быть указаны в column_list и value_list, равно 16.

    column_list, используемое в разделе COLUMNS, может содержать только имена столбцов; каждый столбец в списке должен быть одним из следующих типов данных MySQL: целочисленные типы, строковые типы и типы столбцов времени или даты. Столбцы, использующие BLOB, TEXT, SET, ENUM, BIT или пространственные типы данных, не допускаются; также не допускаются столбцы, использующие типы чисел с плавающей точкой. Кроме того, нельзя использовать функции или арифметические выражения в разделе COLUMNS.

    Раздел VALUES LESS THAN, используемый в определении раздела, должен указывать значение литерала для каждого столбца, указанного в разделе COLUMNS(); то есть список значений, используемых для каждого раздела VALUES LESS THAN, должен содержать то же количество значений, что и количество столбцов, указанных в разделе COLUMNS. Попытка использовать больше или меньше значений в разделе VALUES LESS THAN, чем столбцов в разделе COLUMNS, приведет к ошибке Несоответствие в использовании списков столбцов для разделения.... Нельзя использовать NULL для значений, указанных в разделе VALUES LESS THAN. Возможна многократная ссылка на MAXVALUE для заданного столбца, отличного от первого, как показано в этом примере:

    CREATE TABLE rc (
        a INT NOT NULL,
        b INT NOT NULL
    )
    PARTITION BY RANGE COLUMNS(a,b) (
        PARTITION p0 VALUES LESS THAN (10,5),
        PARTITION p1 VALUES LESS THAN (20,10),
        PARTITION p2 VALUES LESS THAN (50,MAXVALUE),
        PARTITION p3 VALUES LESS THAN (65,MAXVALUE),
        PARTITION p4 VALUES LESS THAN (MAXVALUE,MAXVALUE)
    );
    

    Каждое значение в списке значений VALUES LESS THAN должно точно соответствовать типу соответствующего столбца; преобразования не производятся. Например, нельзя использовать строку '1' для значения, соответствующего столбцу целого типа (необходимо использовать числовое значение 1), также нельзя использовать числовое значение 1 для значения, соответствующего столбцу строкового типа (в этом случае необходимо использовать строку в кавычках: '1').

    Более подробная информация см. в разделе 26.2.1 «RANGE Partitioning» и разделе 26.4 «Partition Pruning».

  • LIST(expr)

    Это полезно при назначении разделов на основе столбца таблицы с ограниченным набором возможных значений, таких как код штата или страны. В таком случае все строки, относящиеся к определённому штату или стране, могут быть назначены одному разделу, или раздел может быть зарезервирован для определённого набора штатов или стран. Это аналогично RANGE, за исключением того, что только VALUES IN может использоваться для указания допустимых значений для каждого раздела.

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

    CREATE TABLE client_firms (
        id   INT,
        name VARCHAR(35)
    )
    PARTITION BY LIST (id) (
        PARTITION r0 VALUES IN (1, 5, 9, 13, 17, 21),
        PARTITION r1 VALUES IN (2, 6, 10, 14, 18, 22),
        PARTITION r2 VALUES IN (3, 7, 11, 15, 19, 23),
        PARTITION r3 VALUES IN (4, 8, 12, 16, 20, 24)
    );
    

    При использовании разбиения по списку вы должны определить по крайней мере один раздел с помощью VALUES IN. Вы не можете использовать VALUES LESS THAN с PARTITION BY LIST.

    Примечание

    Для таблиц, разбиение которых выполняется по LIST, список значений, используемый с VALUES IN, должен состоять только из целых значений. В MySQL 8.4 вы можете преодолеть это ограничение, используя разбиение по LIST COLUMNS, которое описано позже в этом разделе.

  • LIST COLUMNS(column_list)

    Этот вариант LIST облегчает обрезку разделов для запросов, использующих условия сравнения по нескольким столбцам (то есть имеющих условия, такие как WHERE a = 5 AND b = 5 или WHERE a = 1 AND b = 10 AND c = 5). Он позволяет указывать значения в нескольких столбцах с помощью списка столбцов в предложении COLUMNS и набора значений столбцов в каждом предложении определения раздела PARTITION ... VALUES IN (value_list).

    Правила, определяющие типы данных для списка столбцов, используемых в LIST COLUMNS(column_list), и списка значений, используемых в VALUES IN(value_list), такие же, как и для списка столбцов, используемых в RANGE COLUMNS(column_list), и списка значений, используемых в VALUES LESS THAN(value_list) соответственно, за исключением того, что в предложении VALUES IN не допускается MAXVALUE, и вы можете использовать NULL.

    Существует одно важное различие между списком значений, используемых для VALUES IN с PARTITION BY LIST COLUMNS, и когда он используется с PARTITION BY LIST. При использовании с PARTITION BY LIST COLUMNS каждый элемент в предложении VALUES IN должен быть множеством значений столбцов; количество значений в каждом наборе должно быть таким же, как и количество столбцов, используемых в предложении COLUMNS, и типы данных этих значений должны соответствовать типам столбцов (и появляться в том же порядке). В простейшем случае набор состоит из одного столбца. Максимальное количество столбцов, которое может быть использовано в column_list и в элементах, составляющих value_list, равно 16.

    Таблица, определённая следующим заявлением CREATE TABLE, предоставляет пример таблицы, использующей разбиение по LIST COLUMNS:

    CREATE TABLE lc (
        a INT NULL,
        b INT NULL
    )
    PARTITION BY LIST COLUMNS(a,b) (
        PARTITION p0 VALUES IN( (0,0), (NULL,NULL) ),
        PARTITION p1 VALUES IN( (0,1), (0,2), (0,3), (1,1), (1,2) ),
        PARTITION p2 VALUES IN( (1,0), (2,0), (2,1), (3,0), (3,1) ),
        PARTITION p3 VALUES IN( (1,3), (2,2), (2,3), (3,2), (3,3) )
    );
    
  • 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. В настоящее время единственный способ использования этой опции — установить все разделы или все подразделы в один и тот же движок хранения, и попытка установить разные движки хранения для разделов или под-разделов в одной таблице вызывает ошибку ERROR 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 активна.

    • MAX_ROWS и MIN_ROWS

      Могут использоваться для указания соответственно максимального и минимального количества строк, хранимых в разделе. Значения для max_number_of_rows и min_number_of_rows должны быть положительными целыми числами. Как и в случае с параметрами таблицы с аналогичными названиями, они действуют только как “предложения” для сервера и не являются жёсткими ограничениями.

    • TABLESPACE

      Может использоваться для назначения InnoDB файловой таблицы пространства имен для раздела путём указания TABLESPACE `innodb_file_per_table`. Все разделы должны принадлежать одному и тому же движку хранения.

      Размещение разбиений таблицы InnoDB в общих пространствах имен InnoDB не поддерживается. Общие пространства имён включают системное пространство имён InnoDB и общие пространства имён.

  • subpartition_definition

    Определение раздела может необязательно содержать одно или несколько предложений subpartition_definition. Каждое из них состоит как минимум из предложения SUBPARTITION 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-8.4-en/create-table.html

Spec-Zone.ru

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