閱讀997 返回首頁    go 小米 go 小米5


NULL值處理__分區_SQL語法參考_雲數據庫 OceanBase-阿裏雲

NULL值視為0

對於分區禁止在空值(NULL)上沒有進行處理,無論它是一個列值還是一個用戶定義表達式的值。一般而言,在這種情況下把 NULL 視為 0。如果你希望回避這種做法,你應該在設計表時不允許空值;最可能的方法是,通過聲明列“NOT NULL”來實現這一點。

說明:此處的 NULL 值,是指表達式計算結果為 NULL,當作 0 處理。

舉例

如果插入一行到按照 RANGE 分區的表,該行用來確定分區的列值為 NULL,分區將把該 NULL 值視為 0。例如,考慮下麵的兩個表,表的創建和插入記錄如下:

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
     -> );
 mysql> INSERT INTO tnrange VALUES (NULL, 'jim');
 mysql> SELECT * FROM tnrange;
 +------+------+
 | id | name |
 +------+------+
 | NULL | jim |
 +------+------+
 1 row in set (0.00 sec)

在表 tnrange 中,id 列沒有聲明為“NOT NULL”,這意味著它們允許 Null 值。可以通過刪除這些分區,然後重新運行 SELECT 語句,來驗證這些行被保存在每個表的 p1 分區中:

mysql> ALTER TABLE tnrange DROP PARTITION p1;
Query OK, 0 rows affected (0.16 sec)

mysql> SELECT * FROM tnrange;
Empty set (0.00 sec)

在按 HASH 分區的情況下,任何產生 NULL 值的表達式都視同好像它的返回值為 0。我們可以通過先創建一個按 HASH 分區的表,然後插入一個包含有適當值的記錄,再檢查對文件係統的作用,來驗證這一點。假定有使用下麵的語句在測試數據庫中創建了一個表 tnhash:

CREATE TABLE tnhash (
 id INT,
 name VARCHAR(5)
 )
 PARTITION BY HASH(id)
     PARTITIONS 2;

現在在表 tnhash 中插入一行id列值為 NULL 的行,然後驗證該行已經被插入

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)

對於任意的整數 N,NULL MOD N 的值總是等於 NULL。這個結果在確定正確的分區方麵被認為是 0。回到係統 shell(仍然假定 bash 用於這個目的) ,通過再次列出數據文件,可以看出值被成功地插入到第一個分區(默認名稱為 p0)中:

mysql> SELECT * FROM tnhash partition(p0);
+------+------+
| id | name |
+------+------+
| NULL | sam |
+------+------+
1 row in set (0.00 sec)

最後更新:2016-11-24 11:23:47

  上一篇:go 子分區__分區_SQL語法參考_雲數據庫 OceanBase-阿裏雲
  下一篇:go 分區管理__分區_SQL語法參考_雲數據庫 OceanBase-阿裏雲