全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 智能硬件
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 更多

NULL值处理

更新时间:2017-06-07 13:26:11

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)
本文导读目录