Spec-Zone .ru
спецификации, руководства, описания, API
|
Разделение списка в 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
разделение".