开发者社区> 问答> 正文

云数据库 OceanBase中的NULL值处理

[backcolor=transparent]NULL值视为0
对于分区禁止在空值(NULL)上没有进行处理,无论它是一个列值还是一个用户定义表达式的值。一般而言,在这种情况下把 NULL 视为 0。如果你希望回避这种做法,你应该在设计表时不允许空值;最可能的方法是,通过声明列“NOT NULL”来实现这一点。
说明:此处的 NULL 值,是指表达式计算结果为 NULL,当作 0 处理。
[backcolor=transparent]举例
如果插入一行到按照 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)

展开
收起
云栖大讲堂 2017-11-01 14:15:24 1877 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
开源HTAP OceanBase产品揭秘 立即下载
云数据库OceanBase 架构演进及在金融核心系统中的实践 立即下载
自研金融数据库OceanBase的创新之路 立即下载