相关文件10bet官方网站 下载本手册 本手册摘录

MySQL 8.0参考手册/.../ MySQL分区如何处理NULL

24.2.7 MySQL分区如何处理空

MySQL中的分区没有什么不允许的无效的作为分区表达式的值,无论是列值还是用户提供的表达式的值。即使允许使用无效的作为表达式的值,否则必须生成整数,请务必记住无效的不是数字。MySQL的分区实现无效的比任何非-无效的价值,就像订货人做。

这意味着无效的在不同类型的分区之间是不同的,如果您没有准备好,可能会产生您不期望的行为。在这种情况下,我们将在本节中讨论每个MySQL分区类型如何处理无效的值,并为每个值提供示例。

使用范围分区处理空值。如果在按分区的表中插入一行射程这样,用于确定分区的列值无效的,该行被插入到最低的分区中。考虑数据库中的这两个表P,创建如下:

mysql>创建表t1(->c1 INT,-->c2 VARCHAR(20)->)->分区范围(c1)(->分区p0值小于(0),->分区p1值小于(10),->分区p2值小于MAXVALUE->);查询正常,0行受影响(0.09秒)mysql>CREATE TABLE t2(->c1 INT,->c2 VARCHAR(20)->)->分区范围(c1)(->分区p0值小于(-5),->分区p1值小于(0),->分区p2值小于(10),->分区p3值小于MAXVALUE->);查询正常,0行受影响(0.09秒)

您可以看到由这两个组件创建的分区创建表语句对分区中的表信息模式数据库:

mysql>从信息模式中选择表名称、分区名称、表行、平均行长度、数据长度>。分区>其中表模式='p'和表名称,如't';+----------------+-----------+-----------+-----------+\调查表U名称和表表U名称。.餐桌U名称名称餐桌名称名称餐桌名称名称餐桌名称餐桌名称名称名称.分区名称|表U名称长度长度数据数据长度长度长度;0 | 0 | t2 | p2 | 0 | 0 | t2 | p3 | 0 | 0 |+------------+----------------+------------+----------------+-------------+7行(0.00秒)

(有关此表的详细信息,请参阅第26.3.21节,“信息分区表”)现在让我们用包含无效的在列中用作分区键,并验证是否使用一对选择声明:

mysql>插入t1值(NULL,'mothra');查询确定,1行受影响(0.00秒)mysql>插入t2值(NULL,'mothra');查询确定,1行受影响(0.00秒)mysql>从t1中选择*;+------+----------+\id | name |+------------+------------+| NULL | mothra |+------------+------------+------------+1行(0.00秒)mysql>从t2中选择*;+------------+------------++id | name |+------------+------------+| NULL | mothra |+------------+------------+集合中的1行(0.00秒)

通过对上一个查询重新运行,可以看到哪些分区用于存储插入的行信息\u SCHEMA.PARTITIONS检查输出:

mysql>从信息模式中选择表名称、分区名称、表行、平均行长度、数据长度>。分区>其中表模式='p'和表名称,如't';+----------------+-----------+-----------+-----------+\表|名称|分区|名称|表|行|平均行|长度|数据|+------------+----------------+------------+----------------+-------------+|t1 | p0 | 1 | 20 | 20||t1 | p1 | 0 | 0 | t1 | p2 | 0 | 0||t2 | p0 | 1 | 20 | 20||t2 | p1 | 0 | 0 | 0 | | t2 | p2 | 0 | 0 | | t2 | p3 | 0 | 0 | | 0 |+------------------+------------------+------------------+----------------+7行(0.01秒)

您还可以通过删除这些分区,然后重新运行选择声明:

mysql>ALTER TABLE t1删除分区p0;查询确定,0行受影响(0.16秒)mysql>ALTER TABLE t2 DROP PARTITION p0;查询确定,0行受影响(0.16秒)mysql>SELECT*fromt1;空集(0.00秒)mysql>SELECT*FROM t2;空集(0.00秒)

(有关更改表。。。放置分区,请参见第13.1.9节,“ALTER TABLE语句”.)

无效的对于使用SQL函数的分区表达式,也是这样处理的。假设我们使用创建表像这样的陈述:

创建表tndate(id INT,dt DATE)按范围分区(年(dt))(分区p0值小于(1990),分区p1值小于(2000),分区p2值小于MAXVALUE);

与其他MySQL函数一样,年份(空)退货无效的. 一排有一个日期列值无效的被视为分区表达式的值小于任何其他值,因此被插入到分区中p0.

使用列表分区处理NULL。按分区的表列表承认无效的值当且仅当它的一个分区是使用包含无效的. 相反的是一个表被列表没有明确使用无效的在值列表中拒绝行,从而导致无效的分区表达式的值,如本例所示:

mysql>创建表ts1(->c1 INT,-->c2 VARCHAR(20)->)->按列表分区(c1)(->PARTITION p0 VALUES IN(0,3,6),->PARTITION p1 VALUES IN(1,4,7),->PARTITION p2 VALUES IN(2,5,8)->);查询确定,0行受影响(0.01秒)mysql>INSERT INTO ts1 VALUES(9,'mothra');错误1504(HY000):表没有值9 mysql>INSERT INTO ts1 VALUES的分区(NULL,'mothra');错误1504(HY000):表没有值NULL的分区

只有行具有c1类值介于08.包含可以插入到ts1型.无效的不在此范围内,就像数字一样9. 我们可以创建表格ts2型ts3型具有包含无效的,如图所示:

mysql>创建表ts2(->c1 INT,-->c2 VARCHAR(20)->)->按列表分区(c1)(->分区p0值在(0,3,6),->分区p1值在(1,4,7),->分区p2值在(2,5,8),->分区p3值在(NULL)->);Query OK,0行受影响(0.01秒)mysql>CREATE TABLE ts3(->c1 INT,->c2 VARCHAR(20)->)->按列表分区(c1)(->分区p0值在(0,3,6),->分区p1值在(1,4,7,NULL),->分区p2值在(2,5,8)->);查询正常,0行受影响(0.01秒)

定义分区的值列表时,可以(而且应该)处理无效的就像其他任何价值观一样。例如,两者中的值(NULL)(1,4,7,NULL)中的值都是有效的(1,NULL,4,7)中的值,中的值(NULL、1、4、7),等等。可以插入一行无效的对于列c1类每一张桌子ts2型ts3型:

mysql>插入ts2值(NULL,'mothra');查询确定,1行受影响(0.00秒)mysql>INSERT INTO ts3 VALUES(NULL,'mothra');查询正常,1行受影响(0.00秒)

通过对信息\u SCHEMA.PARTITIONS,您可以确定使用了哪些分区来存储刚刚插入的行(我们假设,与前面的示例一样,分区表是在P数据库):

mysql>从信息\模式中选择表\名称、分区\名称、表\行、平均\行\长度、数据\长度>表|名称|分区|名称|表|行|平均|行|长度|数据|长度|+-------------------+-------------------+-------------------+| ts2 | p0 | 0 | 0 | ts2 | p1 | 0 | 0 | ts2 | p2 | 0 | 0 | 0||ts2 | p3 | 1 | 20 | 20||ts3 | p0 | 0 | 0 | 0||ts3 | p1 | 1 | 20 | 20||ts3 | p2 | 0 | 0 | 0 |+----------------+----------------+----------------+----------------+7行(0.01秒)

如本节前面所示,您还可以通过删除这些分区然后执行选择.

使用哈希和密钥分区处理空值。无效的对于按搞砸钥匙. 在这些情况下,任何产生无效的值被视为其返回值为零。我们可以通过检查创建按分区的表对文件系统的影响来验证这种行为搞砸并用包含适当值的记录填充它。假设你有一张桌子(同样在P数据库)使用以下语句创建:

mysql>创建表th(->c1 INT,->c2 VARCHAR(20)->)->按哈希分区(c1)->分区2;查询正常,0行受影响(0.00秒)

可以使用以下查询查看属于此表的分区:

mysql>从信息\u SCHEMA.PARTITIONS>中选择表\u NAME、分区\u NAME、表\u ROWS、平均行\u LENGTH、数据\u LENGTH>,其中表\u SCHEMA='p'和表\u NAME='th';+----------------+-----------+-----------+-----------+\124;表|名称|分区|名称|表|行|平均行|长度|数据|长度|+----------------+----------------+----------------+-----------+-----------+----------------+| th | p0 | 0 | 0 | th | p1 | 0 | 0 | 0 | 0 |+-----------+-----------+-----------+-----------+-----------+2行(0.00秒)

表\u行每个分区的值为0。现在将两行插入谁的c1类列值为无效的和0,并验证是否插入了这些行,如下所示:

mysql>插入th值(NULL,'mothra'),(0,'gigan');查询确定,1行受影响(0.00秒)mysql>从th选择*;+------+------+|c1 | c2 |+------------+------------+| NULL | mothra |+------------+------------+------------+| 0 | gigan |+------------+------------+2行(0.01秒)

回想一下,对于任何整数N,的值空模式N总是无效的. 对于按分区的表搞砸钥匙,则将此结果视为确定正确的分区0. 检查信息\u SCHEMA.PARTITIONS表中,我们可以再次看到这两行都被插入到了分区中p0:

mysql>从信息\u SCHEMA.PARTITIONS>中选择表\u NAME、分区\u NAME、表\u ROWS、平均行\u LENGTH、数据\u LENGTH>,其中表\u SCHEMA='p'和表\u NAME='th';+----------------+-----------+-----------+-----------+\124;表|名称|分区|名称|表|行|平均行|长度|数据|+------------+----------------+------------+----------------+-------------+|th | p0 | 2 | 20 | 20||th | p1 | 0 | 0 |+----------------+----------------+----------------+----------------+集合中的2行(0.00秒)

通过使用重复上一个示例按键分区代替按哈希划分在表的定义中,可以验证无效的对于这种类型的分区,也被视为0。