Die Partitionierung in MySQL gestattet durchaus auch einen
Partitionierungsausdruck mit dem Wert NULL
,
sei es nun ein Spaltenwert oder der Wert eines vom Benutzer
angegebenen Ausdrucks. Normalerweise behandelt MySQL
NULL
in solchen Fällen als null. Wenn Sie
dieses Verhalten unterbinden möchten, müssen Sie Tabellen so
entwerfen, dass sie keine Nullwerte erlauben, indem Sie die
Spalten als NOT NULL
deklarieren.
In diesem Abschnitt geben wir einige Beispiele, die zeigen
sollen, wie MySQL NULL
-Werte verarbeitet,
wenn die passende Partition für eine Zeile ermittelt werden
soll.
Wenn Sie eine Zeile in eine RANGE
- oder
LIST
-partitionierte Tabelle einfügen und der
Spaltenwert, der zur Bestimmung der Partition herangezogen wird,
NULL
ist, so wird dieser Wert als
0
interpretiert. Betrachten Sie
beispielsweise die folgenden beiden Tabellen:
mysql>CREATE TABLE tnlist (
->id INT,
->name VARCHAR(5)
->)
->PARTITION BY LIST(id) (
->PARTITION p1 VALUES IN (0),
->PARTITION p2 VALUES IN (1)
->);
Query OK, 0 rows affected (0.09 sec) mysql>CREATE TABLE tnrange (
->id INT,
->name VARCHAR(5)
->)
->PARTITION BY RANGE(id) (
->PARTITION p1 VALUES LESS THAN (1),
->PARTITION p2 VALUES LESS THAN MAXVALUE
->);
Query OK, 0 rows affected (0.09 sec) mysql>INSERT INTO tnlist VALUES (NULL, 'bob');
Query OK, 1 row affected (0.00 sec) mysql>INSERT INTO tnrange VALUES (NULL, 'jim');
Query OK, 1 row affected (0.00 sec) mysql>SELECT * FROM tnlist;
+------+------+ | id | name | +------+------+ | NULL | bob | +------+------+ 1 row in set (0.00 sec) mysql>SELECT * FROM tnrange;
+------+------+ | id | name | +------+------+ | NULL | jim | +------+------+ 1 row in set (0.00 sec)
In beiden Tabellen war die Spalte id
nicht
als NOT NULL
deklariert, kann also
NULL
-Werte annehmen. Dass die Zeilen in den
p1
-Partitionen der Tabellen gespeichert
wurden, können Sie überprüfen, indem Sie diese Partitionen
löschen und dann die SELECT
-Anweisungen
erneut ausführen:
mysql>ALTER TABLE tnlist DROP PARTITION p1;
Query OK, 0 rows affected (0.16 sec) mysql>ALTER TABLE tnrange DROP PARTITION p1;
Query OK, 0 rows affected (0.16 sec) mysql>SELECT * FROM tnlist;
Empty set (0.00 sec) mysql>SELECT * FROM tnrange;
Empty set (0.00 sec)
Bei einer HASH
- oder
KEY
-Partitionierung wird ein
Partitionierungsausdruck, der NULL
ergibt, so
behandelt, als sei sein Rückgabewert null. Dieses Verhalten
können wir überprüfen, indem wir betrachten, wie sich die
Erstellung einer HASH
-partitionierten
Tabelle, in die eine Zeile mit den entsprechenden Daten geladen
wird, auf das Dateisystem auswirkt. Angenommen, Sie haben eine
Tabelle namens tnhash
in der Datenbank
test
mit folgender Anweisung angelegt:
CREATE TABLE tnhash ( id INT, name VARCHAR(5) ) PARTITION BY HASH(id) PARTITIONS 2;
Wenn wir eine RPM-Installation von MySQL auf Linux zugrunde
legen, erzeugt diese Anweisung zwei
.MYD
-Dateien in
/var/lib/mysql/test
, die in der
bash-Shell wie folgt angezeigt werden
können:
/var/lib/mysql/test> ls *.MYD -l
-rw-rw---- 1 mysql mysql 0 2005-11-04 18:41 tnhash#P#p0.MYD
-rw-rw---- 1 mysql mysql 0 2005-11-04 18:41 tnhash#P#p1.MYD
(Hinweis: Vor MySQL 5.1.5
hätten diese Dateien tnhash_p0.MYD
und
tnhash_p1.MYD
geheißen. Unter
Abschnitt D.1.1, „Änderungen in Release 5.1.6 (Noch nicht veröffentlicht)“, und Bug#13437 finden Sie weitere
Informationen darüber, wie sich diese Änderung auf Upgrades
auswirkt.)
Beachten Sie, dass die beiden Dateien 0 Byte groß sind. Fügen
Sie nun in tnhash
eine Zeile ein, die in der
Spalte id
den Wert NULL
aufweist, und überprüfen Sie, ob die Zeile tatsächlich
eingefügt wurde:
mysql>INSERT INTO tnhash VALUES (NULL, 'sam');
Query OK, 1 row affected (0.00 sec) mysql>SELECT * FROM tnhash;
+------+------+ | id | name | +------+------+ | NULL | sam | +------+------+ 1 row in set (0.01 sec)
Bitte erinnern Sie sich, dass für einen Integer
N
der Wert von NULL MOD
immer
N
NULL
ist. Dieses Ergebnis wird behandelt, um
0
als die korrekte Partition festzulegen.
Wenn wir nun wieder in die System-Shell gehen (wobei weiterhin
bash zugrunde gelegt wird), können wir
erkennen, dass der Wert in die erste Partition (die nach
Voreinstellung p0
heißt) eingefügt wurde,
indem wir die Datendateien erneut auflisten:
var/lib/mysql/test> ls *.MYD -l
-rw-rw---- 1 mysql mysql 20 2005-11-04 18:44 tnhash#P#p0.MYD
-rw-rw---- 1 mysql mysql 0 2005-11-04 18:41 tnhash#P#p1.MYD
Wie Sie sehen, hat die INSERT
-Anweisung nur
die Datei tnhash_p0.MYD
modifiziert, deren
Umfang auf der Platte angewachsen ist, ohne auf die andere
Datendatei Einfluss zu nehmen.
Nehmen wir nun an, wir hätten folgende Tabelle:
CREATE TABLE tndate ( id INT, dt DATE ) PARTITION BY RANGE( YEAR(dt) ) ( PARTITION p0 VALUES LESS THAN (1990), PARTITION p1 VALUES LESS THAN (2000), PARTITION p2 VALUES LESS THAN MAXVALUE );
Wie andere MySQL-Funktionen gibt auch
YEAR(NULL)
den Wert NULL
zurück. Eine Zeile, die in der dt
-Spalte den
Wert NULL
hat, wird behandelt, als wäre der
Partitionierungsausdruck in Wirklichkeit 0
,
und folglich in die Partition p0
eingefügt.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.