Spec-Zone .ru
спецификации, руководства, описания, API

17.2.2. LIST Разделение

Разделение списка в MySQL подобно диапазону, делящему разными способами. Как в разделении RANGE, каждый раздел должен быть явно определен. Главное различие между двумя типами разделения - то, что в разделении списка каждый раздел определяется и выбирается основанный на членстве значения столбца в одном из ряда списков значения, а не в одном из ряда непрерывных диапазонов значений. Это делается при использовании PARTITION BY LIST(expr) где expr значение столбца или выражение, основанное на значении столбца и возврате целочисленного значения, и затем определении каждого раздела посредством a VALUES IN (value_list), где value_list список разделенных запятой значений целых чисел.

Отметить

В MySQL 5.7 возможно соответствовать против только списка целых чисел (и возможно NULL— см. Раздел 17.2.7, "Дескрипторы Разделения MySQL How NULL"), деля LIST.

Однако, другие типы столбца могут использоваться в списках значения, используя LIST COLUMN разделение, которое описывается позже в этом разделе.

В отличие от случая с разделами, определенными диапазоном, разделы списка не должны быть объявлены ни в каком определенном порядке. Для более подробной синтаксической информации см. Раздел 13.1.14,"CREATE TABLE Синтаксис".

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

CREATE TABLE employees (    id INT NOT NULL,    fname VARCHAR(30),    lname VARCHAR(30),    hired DATE NOT NULL DEFAULT '1970-01-01',    separated DATE NOT NULL DEFAULT '9999-12-31',    job_code INT,    store_id INT);

(Это - та же самая таблица, используемая в качестве основания для примеров в Разделе 17.2.1,"RANGE Разделение".)

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

Область Сохраните Идентификационные номера
Север 3, 5, 6, 9, 17
Восток 1, 2, 10, 11, 19, 20
Запад 4, 12, 13, 14, 18
Центральный 7, 8, 15, 16

Чтобы разделить эту таблицу таким способом, которым строки для хранилищ, принадлежащих той же самой области, сохранены в том же самом разделе, Вы могли использовать CREATE TABLE оператор, показанный здесь:

CREATE TABLE employees (    id INT NOT NULL,    fname VARCHAR(30),    lname VARCHAR(30),    hired DATE NOT NULL DEFAULT '1970-01-01',    separated DATE NOT NULL DEFAULT '9999-12-31',    job_code INT,    store_id INT)PARTITION BY LIST(store_id) (    PARTITION pNorth VALUES IN (3,5,6,9,17),    PARTITION pEast VALUES IN (1,2,10,11,19,20),    PARTITION pWest VALUES IN (4,12,13,14,18),    PARTITION pCentral VALUES IN (7,8,15,16));

Это облегчает добавлять или отбрасывать записи сотрудника, касающиеся определенных областей к или от таблицы. Например, предположите, что все хранилища в Западной области продаются другой компании. В MySQL 5.7 все строки, касающиеся сотрудников, работающих в хранилищах в той области, могут быть удалены с запросом ALTER TABLE employees TRUNCATE PARTITION pWest, который может быть выполнен намного более эффективно чем эквивалент DELETE оператор DELETE FROM employees WHERE store_id IN (4,12,13,14,18);. (Используя ALTER TABLE employees DROP PARTITION pWest также удалил бы все эти строки, но также удалит раздел pWest из определения таблицы; Вы должны были бы использовать ALTER TABLE ... ADD PARTITION оператор, чтобы восстановить исходную схему выделения разделов таблицы.)

Как с RANGE разделение, возможно объединиться LIST разделение с разделением хешем или ключом, чтобы произвести разделение составного объекта (подразделение). См. Раздел 17.2.6, "Подделя".

В отличие от случая с RANGE разделение, нет никакого "вместилища" такого как MAXVALUE; все математические ожидания для выражения разделения должны быть покрыты в PARTITION ... VALUES IN (...) пункты. INSERT оператор, содержащий несогласованное значение столбца разделения, перестал работать с ошибкой, как показано в этом примере:

mysql> CREATE TABLE h2
        (    ->   c1 INT,    ->   c2 INT    -> )    -> PARTITION BY LIST(c1) (    ->   PARTITION
        p0 VALUES IN (1, 4, 7),    ->   PARTITION p1 VALUES IN (2, 5,
        8)    -> );Query OK, 0 rows affected (0.11 sec)mysql> INSERT INTO h2 VALUES (3, 5);ERROR 1525 (HY000): Table has no partition for value 3

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

mysql> SELECT * FROM h2;Empty set (0.00 sec)mysql> INSERT INTO h2 VALUES (4, 7), (3, 5), (6, 0);ERROR 1525 (HY000): Table has no partition for value 3mysql> SELECT * FROM h2;+------+------+| c1   | c2   |+------+------+|    4 |    7 |+------+------+1 row in set (0.00 sec)

Можно заставить этот тип ошибки быть проигнорированным при использовании IGNORE ключевое слово. Если Вы делаете так, строки, содержащие несогласованные значения столбцов разделения, не вставляются, но любые строки с совпадающими значениями вставляются, и ни о каких ошибках не сообщают:

mysql> TRUNCATE h2;Query OK, 1 row affected (0.00 sec)mysql> SELECT * FROM h2;Empty set (0.00 sec)mysql> INSERT IGNORE INTO h2 VALUES (2, 5), (6, 10), (7, 5), (3, 1), (1,
        9);Query OK, 3 rows affected (0.00 sec)Records: 5  Duplicates: 2  Warnings: 0mysql> SELECT * FROM h2;+------+------+| c1   | c2   |+------+------+|    7 |    5 ||    1 |    9 ||    2 |    5 |+------+------+3 rows in set (0.00 sec)

MySQL 5.7 оказывает поддержку для LIST COLUMNS разделение. Это - разновидность LIST разделение, которое позволяет Вам использовать столбцы типов кроме целочисленных типов для того, чтобы разделить столбцы, так же как использовать многократные столбцы в качестве разделения ключей. Для получения дополнительной информации см. Раздел 17.2.3.2,"LIST COLUMNS разделение".