LIST分区

LIST分区是建立离散的值列表告诉数据库特定的值属于哪个分区,LIST分区在很多方面类似于RANGE分区,区别在LIST分区是从属于一个枚举列表的值得集合,RANGE分区是从属于一个连续区间值得集合。
LIST分区通过使用PARTITION BY LIST(expr)子句来实现,expr是某列值或一个局域某列值返回一个整数值得表达式,然后通过VALUES IN(value_list)的方式来定义分区,其中value_list是一个逗号分隔的整数列表。与RANGE分区不同,LIST分区不必声明任何特定顺序

下面的例子中我们以下表为基表

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
);

假设有20家店铺,下表中列出了各个区域包含的店铺ID

Region Store ID Numbers
North 3, 5, 6, 9, 17
East 1, 2, 10, 11, 19, 20
West 4, 12, 13, 14, 18
Central 7, 8, 15, 16

下面按照店铺所属区域进行分区

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY LIST(store_id) (
    PARTITION pNorth VALUES IN (3,5,6,9,17),
    PARTITION pEast VALUES IN (1,2,10,11,19,20),
    PARTITION pWest VALUES IN (4,12,13,14,18),
    PARTITION pCentral VALUES IN (7,8,15,16)
);

假设西部门店的全部出售给了另一家公司
可以使用ALTER TABLE employees TRUNCATE PARTITION pWest清空数据
当然也可使用ALTER TABLE employees DROP PARTITION pWest删除这一分区

与RANGE分区不同的是,LIST分区没有MAXVALUE这种关键字。如果要插入的数据与分区列表不匹配,会引发错误

mysql> CREATE TABLE h2 (
    ->   c1 INT,
    ->   c2 INT
    -> )
    -> PARTITION BY LIST(c1) (
    ->   PARTITION p0 VALUES IN (1, 4, 7),
    ->   PARTITION p1 VALUES IN (2, 5, 8)
    -> );
Query OK, 0 rows affected (0.11 sec)

mysql> INSERT INTO h2 VALUES (3, 5);
ERROR 1525 (HY000): Table has no partition for value 3

不过当你使用下面这种MySQL特有的插入语法时,需要注意
INSERT INTO h2 VALUES (2, 5), (6, 10), (7, 5), (3, 1), (1, 9);
如果H2表为事务引擎表,如innodb,那么整个插入被视为一个事务,所以当任何一条记录没有匹配到分区列表时,所有的记录都不被插入
如果H2表为非事务引擎表,如MyISAM,那么引发错误前的记录将被插入,而引发错误的记录包括其后的记录都会插入失败

CREATE TABLE h2 (
  c1 INT,
  c2 INT
) engine=innodb
PARTITION BY LIST(c1) (
  PARTITION p0 VALUES IN (1, 4, 7),
  PARTITION p1 VALUES IN (2, 5, 8)
);

mysql> insert into h2 values(1,2),(4,8),(7,8),(3,4),(1,8);
ERROR 1526 (HY000): Table has no partition for value 3
mysql> select * from h2;
Empty set (0.00 sec)

CREATE TABLE h2 (
  c1 INT,
  c2 INT
) engine=myisam
PARTITION BY LIST(c1) (
  PARTITION p0 VALUES IN (1, 4, 7),
  PARTITION p1 VALUES IN (2, 5, 8)
);

mysql> insert into h2 values(1,2),(4,8),(7,8),(3,4),(1,8);
ERROR 1526 (HY000): Table has no partition for value 3
mysql> select * from h2;
+------+------+
| c1   | c2   |
+------+------+
|    1 |    2 |
|    4 |    8 |
|    7 |    8 |
+------+------+
3 rows in set (0.00 sec)

你可使用IGNORE关键字避免上面的情况,使用IGNORE关键字后,只有引发错误的值将不被插入,其他正常值可以插入,并且不会抛出错误

创建innodb表
drop table if exists h2;
CREATE TABLE h2 (
  c1 INT,
  c2 INT
) engine=innodb
PARTITION BY LIST(c1) (
  PARTITION p0 VALUES IN (1, 4, 7),
  PARTITION p1 VALUES IN (2, 5, 8)
);

mysql> insert IGNORE into h2 values(1,2),(4,8),(7,8),(3,4),(1,8);
Query OK, 4 rows affected (0.00 sec)
Records: 5  Duplicates: 1  Warnings: 0

mysql> select * from h2;
+------+------+
| c1   | c2   |
+------+------+
|    1 |    2 |
|    4 |    8 |
|    7 |    8 |
|    1 |    8 |
+------+------+
4 rows in set (0.00 sec)
注意在未使用IGNORE前,所有的记录都没有被插入

创建MyISAM表
drop table if exists h2;
CREATE TABLE h2 (
  c1 INT,
  c2 INT
) engine=myisam
PARTITION BY LIST(c1) (
  PARTITION p0 VALUES IN (1, 4, 7),
  PARTITION p1 VALUES IN (2, 5, 8)
);

mysql> insert IGNORE into h2 values(1,2),(4,8),(7,8),(3,4),(1,8);
Query OK, 4 rows affected (0.00 sec)
Records: 5  Duplicates: 1  Warnings: 0

mysql> select * from h2;
+------+------+
| c1   | c2   |
+------+------+
|    1 |    2 |
|    4 |    8 |
|    7 |    8 |
|    1 |    8 |
+------+------+
4 rows in set (0.00 sec)
注意未使用IGNORE前,最后一条(1,8)也没有被插入

Mysql --分区(4)List分区的更多相关文章

  1. [MySQL Reference Manual] 20 分区

    20 分区 20 分区 20.1 MySQL的分区概述 20.2 分区类型 20.2.1 RANGE分区 20.2.2 LIST分区 20.2.3 COLUMNS分区 20.2.3.1 RANGE C ...

  2. Mysql分表和分区的区别、分库分表介绍与区别

    分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...

  3. Mysql --分区表(6)Hash分区

    HASH分区 HASH分区主要用来分散热点读,确保数据在预先确定个数的分区中尽可能平均分布.对一个表执行HASH分区时,MySQL会对分区键应用一个散列函数,以此确定数据应当放在N个分区中的哪个分区 ...

  4. Mysql --分区表(5)Columns分区

    COLUMNS分区 COLUMNS分区是RANGE和LIST分区的变种.COLUMNS分区支持多列作为分区键进行分区 RANGE COLUNMS分区和LIST COLUMNS都支持非INT型列作为分区 ...

  5. Mysql --分区(3)range分区

    3.分区类型 RANGE分区 按照range分区的表是利用取值范围将数据分成分区,区间要连续并且不能互相重叠,使用values less than操作符进行分区定义 CREATE TABLE tnp ...

  6. mysql的分区技术(建立分区)

    -- mysql建立表分区,使用range方法建立: create table t_range( id int(11), money int(11) unsigned not null, date d ...

  7. mysql分表,分区的区别和联系

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘 ...

  8. Mysql分表和分区的区别

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘 ...

  9. mysql表分区、查看分区

    原文地址:http://blog.csdn.net/feihong247/article/details/7885199 一.       mysql分区简介 数据库分区 数据库分区是一种物理数据库设 ...

随机推荐

  1. Esfog_UnityShader教程_逐帧动画

    有段日子没出这个系列的新文章了,今天就拿一个比较常见也比较基础的利用改变Shader来改变不断调整UV实现播放逐帧动画的小功能.很久没写了就当练练手了.在新版本的Unity中早就已经集成了Sprite ...

  2. 调用jar程序,读取与jar同级的配置文件。

    System.getProperty("user.dir") + "\\Mysettings.properties";//该方法在Alimonitor里取不到绝 ...

  3. PHP指定字段的多维数组排序方法

    PHP数组排序可以用array_multisort方法实现,但是如果是多维数组,并且我们要指定数组中的某个字段进行排序,那么这就需要我们自己写方法实现了. function sortArrByFiel ...

  4. projecteuler Problem 8 Largest product in a series

    The four adjacent digits in the 1000-digit number that have the greatest product are 9 × 9 × 8 × 9 = ...

  5. TCP控制拥塞的四种算法:慢开始,拥塞避免,快重传,快恢复

    我们在开始假定: 1:数据是单方向传递,另一个窗口只发送确认. 2:接收方的缓存足够大,因此发送方的大小的大小由网络的拥塞程度来决定. 一:慢开始算法和拥塞避免算法 发送方会维持一个拥塞窗口,刚开始的 ...

  6. AX2012R2使用SQL Server2014安装报表扩展报错

    尝试在SQL Server2014上安装AX2012 R2的Reporting Services扩展失败,出现如下错误: "Could not load file or assembly ' ...

  7. xfire配置(java中的webservice)

    开发时需要在src中新建META-INF=>xfire=>services.xml 这样编译出来就在classes文件夹下. services.xml配置 <?xml version ...

  8. Java值传递和引用传递详细解说

    前天在做系统的时候被Java中参数传递问题卡了一下,回头查阅了相关的资料,对参数传递问题有了新的了解和掌握,但是有个问题感觉还是很模糊,就是 Java中到底是否只存在值传递,因为在查阅资料时,经常看到 ...

  9. cell的自适应

    +(CGFloat)getCellHeightWithItem:(FXOwnershipStrutureInfo *)item { if (item.rowH) {//如有rowH就直接返回,避免重新 ...

  10. scala学习心得3

    在scala中可以定义函数字面量参数,定义方式如下: