Spec-Zone.ru › MySQL 5.7

13.1.18 Оператор CREATE TABLE

  • 13.1.18.1 Файлы, созданные оператором CREATE TABLE
  • 13.1.18.2 Оператор CREATE TEMPORARY TABLE
  • 13.1.18.3 Оператор CREATE TABLE ... LIKE
  • 13.1.18.4 Оператор CREATE TABLE ... SELECT
  • 13.1.18.5 Ограничения FOREIGN KEY
  • 13.1.18.6 Неявные изменения спецификаций столбцов
  • 13.1.18.7 CREATE TABLE и сгенерированные столбцы
  • 13.1.18.8 Вторичные индексы и сгенерированные столбцы
  • 13.1.18.9 Настройка параметров комментариев NDB
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    (create_definition,...)
    [table_options]
    [partition_options]

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

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

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

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

data_type:
    (see Chapter 11, Data Types)

key_part:
    col_name [(length)] [ASC | DESC]

index_type:
    USING {BTREE | HASH}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Имя таблицы

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

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

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

  • Индексы и внешние ключи

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

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

Имя таблицы

  • tbl_name

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

    Правила допустимых имён таблиц приведены в Разделе 9.2, “Имена объектов схемы”.

  • IF NOT EXISTS

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

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

При создании таблицы можно использовать ключевое слово TEMPORARY. TEMPORARY таблица видна только в текущей сессии и автоматически удаляется при закрытии сессии. Дополнительную информацию см. в Разделе 13.1.18.2, “Оператор CREATE TEMPORARY TABLE”.

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

  • LIKE

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

    CREATE TABLE new_tbl LIKE orig_tbl;
    

    Дополнительную информацию см. в Разделе 13.1.18.3, “Оператор CREATE TABLE ... LIKE”.

  • [AS] query_expression

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

    CREATE TABLE new_tbl AS SELECT * FROM orig_tbl;
    

    Дополнительную информацию см. в Разделе 13.1.18.4, “Оператор CREATE TABLE ... SELECT”.

  • IGNORE | REPLACE

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

    Дополнительную информацию см. в Разделе 13.1.18.4, “Оператор CREATE TABLE ... SELECT”.

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

Жесткое ограничение — 4096 столбцов на таблицу, но эффективное максимальное значение может быть меньше для конкретной таблицы и зависит от факторов, обсуждаемых в Разделе 8.4.7, “Ограничения на количество столбцов таблицы и размер строки”.

  • data_type

    data_type обозначает тип данных в определении столбца. Для получения полного описания синтаксиса, используемого для указания типов данных столбцов, а также информации о свойствах каждого типа, см. Главу 11, Типы данных.

    • Некоторые атрибуты не применяются ко всем типам данных. AUTO_INCREMENT применяется только к целым и дробным типам. DEFAULT не применяется к типам BLOB, TEXT, GEOMETRY и JSON.

    • Типы данных символьных данных (CHAR, VARCHAR, типы TEXT, ENUM, SET и любые синонимы) могут включать CHARACTER SET для указания набора символов для столбца. CHARSET является синонимом для CHARACTER SET. Коллирование для набора символов можно указать с помощью атрибута COLLATE, а также любых других атрибутов. Подробности см. в Главе 10, Наборы символов, кодировки, Unicode. Пример:

      CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
      

      MySQL 5.7 интерпретирует спецификации длины в определениях столбцов символьных данных в символах. Длины для BINARY и VARBINARY указаны в байтах.

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

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

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

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

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

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

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

  • NOT NULL | NULL

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

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

  • DEFAULT

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

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

  • AUTO_INCREMENT

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

    Для получения значения AUTO_INCREMENT после вставки строки используйте функцию SQL LAST_INSERT_ID() или функцию C API. См. Раздел 12.15, “Функции информации” и .

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

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

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

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

    SELECT * FROM tbl_name WHERE auto_col IS NULL
    

    Этот метод требует, чтобы переменная sql_auto_is_null не была установлена в 0. См. Раздел 5.1.7, “Системные переменные сервера”.

    Для информации о InnoDB и AUTO_INCREMENT см. Раздел 14.6.1.6, “Обработка AUTO_INCREMENT в InnoDB”. Для информации о AUTO_INCREMENT и репликации MySQL см. Раздел 16.4.1.1, “Репликация и AUTO_INCREMENT”.

END_OF_DOCUMENT_MARKER ```
  • COMMENT

    Комментарий к столбцу можно указать с помощью опции COMMENT, длиной до 1024 символов. Комментарий отображается операторами SHOW CREATE TABLE и SHOW FULL COLUMNS. Он также отображается в столбце COLUMN_COMMENT таблицы Information Schema COLUMNS.

  • COLUMN_FORMAT

    В NDB Cluster также можно указать формат хранения данных для отдельных столбцов таблиц NDB с помощью COLUMN_FORMAT. Разрешенные форматы столбцов — FIXED, DYNAMIC и DEFAULT. FIXED используется для указания хранения фиксированной ширины, DYNAMIC позволяет сделать столбец переменной ширины, а DEFAULT заставляет столбец использовать хранение фиксированной или переменной ширины, в зависимости от типа данных столбца (возможно, переопределено спецификатором ROW_FORMAT).

    Начиная с MySQL NDB Cluster 7.5.4, для таблиц NDB, значение по умолчанию для COLUMN_FORMAT — FIXED. (Значение по умолчанию было изменено на DYNAMIC в MySQL NDB Cluster 7.5.1, но это изменение было отменено для сохранения обратной совместимости с существующими версиями релизов.) (Ошибка #24487363)

    В NDB Cluster максимальный возможный смещение для столбца, определенного с помощью COLUMN_FORMAT=FIXED, составляет 8188 байт. Более подробная информация и возможные обходные пути приведены в разделе 21.2.7.5, «Ограничения, связанные с объектами базы данных в NDB Cluster».

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

  • STORAGE

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

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

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

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

  • GENERATED ALWAYS

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

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

Индексы и внешние ключи

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

  • CONSTRAINT symbol

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

    Примечание

    Если оператор CONSTRAINT symbol не указан в определении внешнего ключа или symbol не включён после ключевого слова CONSTRAINT, NDB использует имя индекса внешнего ключа.

    Стандарт SQL определяет, что все типы ограничений (первичный ключ, уникальный индекс, внешний ключ, условие) относятся к одному пространству имён. В MySQL каждый тип ограничения имеет собственное пространство имён для каждой схемы. Следовательно, имена каждого типа ограничения должны быть уникальными для каждой схемы.

  • PRIMARY KEY

    Уникальный индекс, где все столбцы ключа должны быть определены как NOT NULL. Если они не явно объявлены как NOT NULL, MySQL объявляет их неявно (и молчаливо). В таблице может быть только один PRIMARY KEY. Имя PRIMARY KEY всегда PRIMARY, и поэтому не может использоваться в качестве имени любого другого типа индекса.

    Если у вас нет PRIMARY KEY и приложение запрашивает PRIMARY KEY в ваших таблицах, MySQL возвращает первый индекс UNIQUE, который не имеет столбцов NULL, как PRIMARY KEY.

    В таблицах InnoDB поддерживайте PRIMARY KEY коротким, чтобы минимизировать нагрузку на хранение для вторичных индексов. Каждая запись вторичного индекса содержит копию столбцов первичного ключа для соответствующей строки. (См. раздел 14.6.2.1, «Кластеризованные и вторичные индексы».)

    В созданной таблице PRIMARY KEY размещается первым, за ним следуют все UNIQUE индексы, а затем — не уникальные индексы. Это помогает оптимизатору MySQL в приоритетном выборе индекса для использования и также быстрее обнаруживать дублированные UNIQUE ключи.

    PRIMARY KEY может быть индексом с несколькими столбцами. Однако вы не можете создать индекс с несколькими столбцами, используя атрибут ключа PRIMARY KEY в спецификации столбца. Это лишь помечает этот столбец как первичный. Вы должны использовать отдельный оператор PRIMARY KEY(key_part, ...).

    Если таблица имеет PRIMARY KEY или UNIQUE NOT NULL индекс, состоящий из одного столбца целого типа, вы можете использовать _rowid для ссылки на индексированный столбец в операциях SELECT, как описано в разделе «Уникальные индексы».

    В MySQL имя PRIMARY KEY является PRIMARY. Для других индексов, если вы не присвоите имя, индексу будет присвоено имя первого индексированного столбца с необязательным суффиксом (_2, _3, ...), чтобы сделать его уникальным. Вы можете просмотреть имена индексов для таблицы с помощью SHOW INDEX FROM tbl_name. См. раздел 13.7.5.22, «Выражение 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. Индексация всегда происходит по всему столбцу; индексация по префиксу столбца не поддерживается, и любая указанная длина префикса игнорируется. Подробности работы см. в разделе 12.9, «Функции полнотекстового поиска». Оператор WITH PARSER может быть указан как значение index_option для ассоциации плагина анализатора с индексом, если операции полнотекстовой индексации и поиска требуют специальной обработки. Этот оператор допустим только для индексов FULLTEXT. Как InnoDB, так и MyISAM поддерживают плагины анализаторов полнотекстового поиска. Дополнительную информацию см. на страницах Плагины анализаторов полнотекстового поиска и Создание плагинов анализаторов полнотекстового поиска.

  • SPATIAL

    Вы можете создавать индексы SPATIAL на пространственных типах данных. Пространственные типы поддерживаются только для таблиц MyISAM и InnoDB, а индексированные столбцы должны быть объявлены как NOT NULL. См. раздел 11.4, «Пространственные типы данных».

  • FOREIGN KEY

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

    Разделённые таблицы, использующие движок хранения InnoDB, не поддерживают внешние ключи. Дополнительную информацию см. в разделе 22.6, «Ограничения и пределы дробления».

  • CHECK

    Оператор CHECK анализируется, но игнорируется всеми движками хранения.

  • key_part

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

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

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

  • index_type

    Некоторые движки хранения позволяют указывать тип индекса при создании индекса. Синтаксис для спецификатора index_type — USING type_name.

    Пример:

    CREATE TABLE lookup
      (id INT, INDEX USING BTREE (id))
      ENGINE = MEMORY;
    

    Предпочтительное положение для USING — после списка столбцов индекса. Его можно указать и перед списком столбцов, но поддержка этого варианта в таком положении устарела; ожидается его удаление в будущих выпусках MySQL.

  • index_option

    Значения index_option задают дополнительные параметры для индекса.

    • KEY_BLOCK_SIZE

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

      Сведения об атрибуте KEY_BLOCK_SIZE на уровне таблицы см. в разделе Параметры таблицы.

    • WITH PARSER

      Параметр WITH PARSER может использоваться только с индексами FULLTEXT. Он связывает плагин анализатора с индексом, если для операций полнотекстового индексирования и поиска требуется специальная обработка. Поддержка плагинов анализатора полнотекста реализована как в InnoDB, так и в MyISAM. Если у вас есть таблица MyISAM с ассоциированным плагином анализатора полнотекста, вы можете преобразовать таблицу в InnoDB, используя ALTER TABLE.

    • COMMENT

      Определения индексов могут включать необязательный комментарий длиной до 1024 символов.

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

    Более подробную информацию о допустимых значениях index_option см. в Разделе 13.1.14, «Оператор CREATE INDEX». Более подробную информацию об индексах см. в Разделе 8.3.1, «Как MySQL использует индексы».

  • reference_definition

    Подробности синтаксиса reference_definition и примеры см. в Разделе 13.1.18.5, «Ограничения FOREIGN KEY».

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

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

    Важно

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

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

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

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

  • reference_option

    Сведения об опциях RESTRICT, CASCADE, SET NULL, NO ACTION и SET DEFAULT см. в Разделе 13.1.18.5, «Ограничения FOREIGN KEY».

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

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

  • ENGINE

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

    Движок хранения Описание
    InnoDB Транзакционно-безопасные таблицы с блокировкой строк и внешними ключами. По умолчанию, движок хранения для новых таблиц. См. Главу 14, Движок хранения InnoDB, а в частности Раздел 14.1, «Введение в InnoDB», если у вас есть опыт работы с MySQL, но вы новичок в InnoDB.
    MyISAM Двоичный переносимый движок хранения, который в основном используется для нагрузок с преимущественно чтением или только для чтения. См. Раздел 15.2, «Движок хранения MyISAM».
    MEMORY Данные для этого движка хранения хранятся только в памяти. См. Раздел 15.3, «Движок хранения MEMORY».
    CSV Таблицы, которые хранят строки в формате CSV. См. Раздел 15.4, «Движок хранения CSV».
    ARCHIVE Движок хранения для архивирования. См. Раздел 15.5, «Движок хранения ARCHIVE».
    EXAMPLE Пример движка. См. Раздел 15.9, «Движок хранения EXAMPLE».
    FEDERATED Движок хранения, который обращается к удалённым таблицам. См. Раздел 15.8, «Движок хранения FEDERATED».
    HEAP Это синоним для MEMORY.
    MERGE Коллекция MyISAM таблиц, используемых как одна таблица. Также известна как MRG_MyISAM. См. Раздел 15.7, «Движок хранения MERGE».
    NDB Кластеризованные, отказоустойчивые, основанные на памяти таблицы, поддерживающие транзакции и внешние ключи. Также известные как NDBCLUSTER. См. Главу 21, MySQL NDB Cluster 7.5 и NDB Cluster 7.6.

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

  • AUTO_INCREMENT

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

    Для движков, которые поддерживают AUTO_INCREMENT параметр таблицы в операторах CREATE TABLE, вы также можете использовать ALTER TABLE tbl_name AUTO_INCREMENT = N для сброса AUTO_INCREMENT значения. Значение не может быть установлено ниже максимального значения, которое в настоящее время находится в столбце.

  • AVG_ROW_LENGTH

    Приблизительная средняя длина строки для вашей таблицы. Вам необходимо установить это только для больших таблиц с переменной длиной строк.

    При создании MyISAM таблицы MySQL использует произведение параметров MAX_ROWS и AVG_ROW_LENGTH, чтобы определить размер получившейся таблицы. Если ни один из параметров не указан, по умолчанию максимальный размер файлов данных и индексов таблицы составляет 256 ТБ. (Если ваша операционная система не поддерживает файлы такого размера, размеры таблиц ограничены пределом размера файла). Если вы хотите уменьшить размер указателей, чтобы индекс был меньше и быстрее, а вам не нужны большие файлы, вы можете уменьшить размер указателя по умолчанию, установив системную переменную myisam_data_pointer_size. (См. Раздел 5.1.7, «Системные переменные сервера»). Если вы хотите, чтобы все ваши таблицы могли расти сверх значения по умолчанию и готовы к тому, что ваши таблицы будут немного медленнее и больше, чем необходимо, вы можете увеличить размер указателя по умолчанию, установив эту переменную. Установка значения в 7 позволяет размещать таблицы размером до 65 536 ТБ.

  • [DEFAULT] CHARACTER SET

    Указывает набор символов по умолчанию для таблицы. CHARSET — синоним для CHARACTER SET. Если имя набора символов — DEFAULT, используется набор символов базы данных.

  • CHECKSUM

    Установите это значение в 1, если вы хотите, чтобы MySQL поддерживал активную контрольную сумму для всех строк (то есть контрольную сумму, которую MySQL обновляет автоматически по мере изменения таблицы). Это немного замедляет обновление таблицы, но также упрощает поиск повреждённых таблиц. Оператор CHECKSUM TABLE сообщает контрольную сумму. (MyISAM только.)

  • [DEFAULT] COLLATE

    Указывает кодировку по умолчанию для таблицы.

  • COMMENT

    Комментарий к таблице, длиной до 2048 символов.

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

    Установка параметров NDB_TABLE. В MySQL NDB Cluster 7.5.2 и более поздних версиях комментарий к таблице в операторе CREATE TABLE или 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 (он игнорируется).

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

  • COMPRESSION

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

  • CONNECTION

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

    Примечание

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

  • DATA DIRECTORY, INDEX DIRECTORY

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

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

    Начиная с MySQL 5.7.17, для использования опции таблицы DATA DIRECTORY или INDEX DIRECTORY необходимо иметь привилегию FILE.

    Важно

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

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

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

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

    Важно

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

  • DELAY_KEY_WRITE

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

  • ENCRYPTION

    Установите опцию ENCRYPTION в значение 'Y', чтобы включить шифрование данных на уровне страницы для таблицы InnoDB, созданной в табличном пространстве. Значения опций не зависят от регистра. Опция ENCRYPTION была представлена с функцией шифрования табличного пространства InnoDB; см. Раздел 14.14, «Шифрование данных InnoDB». Плагин keyring должен быть установлен и настроен перед включением шифрования.

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

  • INSERT_METHOD

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

  • KEY_BLOCK_SIZE

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

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

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

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

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

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

  • MAX_ROWS

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

    Важно

    Использование MAX_ROWS с таблицами NDB для управления количеством разделов таблицы устарело, начиная с NDB Cluster 7.5.4. Оно всё ещё поддерживается в более поздних версиях для обратной совместимости, но может быть удалено в будущих релизах. Используйте 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

    Этот параметр не используется. Если вам нужно зашифровать файлы .frm и сделать их непригодными для использования другим сервером MySQL, свяжитесь с отделом продаж.

  • ROW_FORMAT

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

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

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

    Для таблиц InnoDB:

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

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

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

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

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

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

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

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

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

    Для таблиц NDB значение по умолчанию ROW_FORMAT в MySQL NDB Cluster 7.5.1 и более поздних версиях равно DYNAMIC. (Ранее оно было FIXED.)

  • STATS_AUTO_RECALC

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

  • STATS_PERSISTENT

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

  • STATS_SAMPLE_PAGES

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

END_OF_DOCUMENT_MARKER ```
  • TABLESPACE

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

    CREATE TABLE tbl_name ... TABLESPACE [=] tablespace_name

    Указанное вами общее табличное пространство должно существовать до использования оператора TABLESPACE. Сведения об общих табличных пространствах см. в разделе 14.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 создаются в табличных пространствах с файлом на таблицу по умолчанию, когда innodb_file_per_table включено.

    Примечание

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

    Оператор DATA DIRECTORY разрешён с CREATE TABLE ... TABLESPACE=innodb_file_per_table, но в противном случае не поддерживается в сочетании с опцией TABLESPACE.

    Примечание

    Поддержка операторов TABLESPACE = innodb_file_per_table и TABLESPACE = innodb_temporary с CREATE TEMPORARY TABLE устарела начиная с MySQL 5.7.24; ожидается её удаление в будущих версиях MySQL.

    Опция таблицы STORAGE используется только с таблицами NDB. STORAGE определяет тип используемого хранилища и может быть либо DISK, либо MEMORY.

    TABLESPACE ... STORAGE DISK назначает таблицу табличному пространству данных диска NDB Cluster. STORAGE DISK нельзя использовать в CREATE TABLE, если ему не предшествует TABLESPACE tablespace_name.

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

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

  • UNION

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

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

    Примечание

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

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

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

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

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

  • PARTITION BY

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

    Примечание

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

  • HASH(expr)

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

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

    Вы не можете использовать ни предложения VALUES LESS THAN, ни VALUES IN с PARTITION BY HASH.

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

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

  • KEY(column_list)

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

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

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

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

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

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

    CREATE TABLE t1 (a INT)
    /*!50100 PARTITION BY KEY */ /*!50611 ALGORITHM = 1 */ /*!50100 ()
          PARTITIONS 3 */
    

    Это заставляет серверы MySQL 5.6.10 и более ранних версий игнорировать опцию, которая в противном случае привела бы к синтаксической ошибке в этих версиях.

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

    Вы не можете использовать ни предложения VALUES LESS THAN, ни VALUES IN с PARTITION BY KEY.

  • RANGE(expr)

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

    Примечание

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

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

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

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

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

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

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

  • RANGE COLUMNS(column_list)

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

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

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

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

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

    Дополнительную информацию см. в разделе 22.2.1, «RANGE Partitioning» и разделе 22.4, «Partition Pruning».

  • LIST(expr)

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

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

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

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

    Примечание

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

  • LIST COLUMNS(column_list)

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

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

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

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

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

    • [STORAGE] ENGINE

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

    • COMMENT

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

      COMMENT = 'Data for the years previous to 1999'
      

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

    • DATA DIRECTORY и INDEX DIRECTORY

      DATA DIRECTORY и INDEX DIRECTORY могут быть использованы для указания каталога, в котором, соответственно, хранятся данные и индексы для данного раздела. И data_dir, и index_dir должны быть абсолютными системными путями.

      Начиная с MySQL 5.7.17, для использования параметров разбиения DATA DIRECTORY или INDEX DIRECTORY требуется привилегия FILE.

      Пример:

      CREATE TABLE th (id INT, name VARCHAR(30), adate DATE)
      PARTITION BY LIST(YEAR(adate))
      (
        PARTITION p1999 VALUES IN (1995, 1999, 2003)
          DATA DIRECTORY = '/var/appdata/95/data'
          INDEX DIRECTORY = '/var/appdata/95/idx',
        PARTITION p2000 VALUES IN (1996, 2000, 2004)
          DATA DIRECTORY = '/var/appdata/96/data'
          INDEX DIRECTORY = '/var/appdata/96/idx',
        PARTITION p2001 VALUES IN (1997, 2001, 2005)
          DATA DIRECTORY = '/var/appdata/97/data'
          INDEX DIRECTORY = '/var/appdata/97/idx',
        PARTITION p2002 VALUES IN (1998, 2002, 2006)
          DATA DIRECTORY = '/var/appdata/98/data'
          INDEX DIRECTORY = '/var/appdata/98/idx'
      );
      

      DATA DIRECTORY и INDEX DIRECTORY ведут себя так же, как в предложении table_option оператора CREATE TABLE для таблиц MyISAM.

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

      В Windows параметры DATA DIRECTORY и INDEX DIRECTORY не поддерживаются для отдельных разделов или под-разделов таблиц MyISAM и параметр INDEX DIRECTORY не поддерживается для отдельных разделов или под-разделов таблиц InnoDB. Эти параметры игнорируются в Windows, за исключением генерации предупреждения. (Ошибка #30459)

      Примечание

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

    • MAX_ROWS и MIN_ROWS

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

    • TABLESPACE

      Может использоваться для обозначения табличного пространства для раздела. Поддерживается NDB Cluster. Для таблиц InnoDB он может быть использован для обозначения табличного пространства «файл на таблицу» для раздела, указав TABLESPACE `innodb_file_per_table`. Все разделы должны принадлежать одному движку хранения.

      Примечание

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

  • subpartition_definition

    Определение разбиения может необязательно содержать одну или несколько subpartition_definition-строк. Каждая из них содержит как минимум SUBPARTITION name, где name — идентификатор подразбиения. За исключением замены ключевого слова PARTITION на SUBPARTITION, синтаксис определения подразбиения идентичен синтаксису определения разбиения.

    Подразбиение должно выполняться с помощью HASH или KEY и может выполняться только для RANGE или LIST разбиений. См. Раздел 22.2.6, «Подразбиение».

Разбиение по сгенерированным столбцам

Разбиение по сгенерированным столбцам разрешено. Например:

CREATE TABLE t1 (
  s1 INT,
  s2 INT AS (EXP(s1)) STORED
)
PARTITION BY LIST (s2) (
  PARTITION p1 VALUES IN (1)
);

Разбиение рассматривает сгенерированный столбец как обычный столбец, что позволяет обойти ограничения функций, которые не разрешены для разбиения (см. Раздел 22.6.3, «Ограничения разбиения, связанные с функциями»). Приведенный пример демонстрирует эту технику: EXP() не может быть использовано непосредственно в PARTITION BY-строке, но разрешен сгенерированный столбец, определенный с использованием EXP().

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/create-table.html

Spec-Zone.ru

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