Паутов Алексей В.
Шрифт:
– > PARTITION p1 VALUES IN (1, 4, 7),
– > PARTITION p2 VALUES IN (2, 5, 8));
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO ts1 VALUES (9, 'mothra');
ERROR 1504 (HY000): Table has no partition for value 9
mysql> INSERT INTO ts1 VALUES (NULL, 'mothra');
ERROR 1504 (HY000): Table has no partition for value NULL
Только строки, имеющие значение c1 между 0 и 8 включительно, могут быть вставлены в ts1. NULL выходит за пределы этого диапазона точно так же, как число 9. Мы можем создавать таблицы ts2 и ts3 и списки значений, содержащие NULL, как показано здесь:
mysql> CREATE TABLE ts2 (c1 INT, c2 VARCHAR(20))
– > PARTITION BY LIST(c1) (
– > PARTITION p0 VALUES IN (0, 3, 6),
– > PARTITION p1 VALUES IN (1, 4, 7),
– > PARTITION p2 VALUES IN (2, 5, 8),
– > PARTITION p3 VALUES IN (NULL));
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE TABLE ts3 (c1 INT, c2 VARCHAR(20))
– > PARTITION BY LIST(c1) (
– > PARTITION p0 VALUES IN (0, 3, 6),
– > PARTITION p1 VALUES IN (1, 4, 7, NULL),
– > PARTITION p2 VALUES IN (2, 5, 8));
Query OK, 0 rows affected (0.01 sec)
При определении значения для выделения разделов, Вы можете обрабатывать NULL точно как любое другое значение, и допустимы VALUES IN (NULL) и VALUES IN (1, 4, 7, NULL) (равно как и VALUES IN (1, NULL, 4, 7), VALUES IN (NULL, 1, 4, 7) и тому подобное). Вы можете вставлять строку, имеющую NULL для столбца c1 в каждую из таблиц ts2 и ts3:
mysql> INSERT INTO ts2 VALUES (NULL, 'mothra');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO ts3 VALUES (NULL, 'mothra');
Query OK, 1 row affected (0.00 sec)
Осматривая файловую систему, Вы можете проверить, что первая из этих инструкций вставила новую строку в раздел p3 таблицы ts2, а вторая инструкция вставила новую строку в раздел p1 таблицы ts3:
/var/lib/mysql/test> ls -l ts2*.MYD
– rw-rw---- 1 mysql mysql 0 2006-03-10 10:35 ts2#P#p0.MYD
– rw-rw---- 1 mysql mysql 0 2006-03-10 10:35 ts2#P#p1.MYD
– rw-rw---- 1 mysql mysql 0 2006-03-10 10:35 ts2#P#p2.MYD
– rw-rw---- 1 mysql mysql 20 2006-03-10 10:35 ts2#P#p3.MYD
/var/lib/mysql/test> ls -l ts3*.MYD
– rw-rw---- 1 mysql mysql 0 2006-03-10 10:36 ts3#P#p0.MYD
– rw-rw---- 1 mysql mysql 20 2006-03-10 10:36 ts3#P#p1.MYD
– rw-rw---- 1 mysql mysql 0 2006-03-10 10:36 ts3#P#p2.MYD
Как в более ранних примерах, мы принимаем использование оболочки bash в операционной системе для Unix для списка файлов. Например, если Вы используете оболочку DOS в операционной системе Windows эквивалент последнего вывода мог быть получен, выполняя команду dir ts3*.MYD в каталоге C:\Program Files\MySQL\MySQL Server 5.1\data\test.
Как показано ранее в этом разделе, Вы можете также проверять, которые разделы использовались для сохранения значений удаляя их, а затем выполняя SELECT.
NULL обработан несколько по-другому для таблиц, разбитых на разделы HASH или KEY. В этих случаях любое выражение раздела, которое выдает значение NULL, обрабатывается, как если бы возвращаемое значение было нулевым. Мы можем проверять это поведение, исследуя эффекты в файловой системе от создания таблицы, разбитой на разделы HASH и начальной загрузкой с записью, содержащей соответствующие значения. Предположите, что Вы имеете таблицу th, созданную в базе данных test, используя эту инструкцию:
mysql> CREATE TABLE th (c1 INT, c2 VARCHAR(20))
– > PARTITION BY HASH(c1) PARTITIONS 2;
Query OK, 0 rows affected (0.00 sec)
При принятии установки RPM MySQL под Linux, эта инструкция создает два .MYD-файла в /var/lib/mysql/test, которые могут просматриваться в оболочке bash следующим образом:
/var/lib/mysql/test> ls th*.MYD -l
– rw-rw---- 1 mysql mysql 0 2005-11-04 18:41 th#P#p0.MYD
– rw-rw---- 1 mysql mysql 0 2005-11-04 18:41 th#P#p1.MYD
Обратите внимание, что размер каждого файла 0 байтов. Теперь вставьте в th строку, чей столбец c1 является NULL, и проверьте, что эта строка была вставлена:
mysql> INSERT INTO th VALUES (NULL, 'mothra');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM th;
+------+---------+
| c1 | c2 |
+------+---------+
| NULL | mothra |
+------+---------+
1 row in set (0.01 sec)
Заметьте, что для любого целого числа N значение NULL MOD N всегда NULL. Для таблиц, которые разбиты на разделы HASH илм KEY, этот результат обрабатывается для определения правильного раздела как 0. При возврате к оболочке системы, мы можем видеть, что значение было вставлено в первый раздел (по умолчанию p0), выводя файлы данных еще раз: