Mysql --分区(4)List分区
来源:互联网 发布:java从入门到精通地5版 编辑:程序博客网 时间:2024/05/17 03:31
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=innodbPARTITION 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 3mysql> select * from h2;Empty set (0.00 sec)CREATE TABLE h2 ( c1 INT, c2 INT) engine=myisamPARTITION 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 3mysql> 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=innodbPARTITION 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: 0mysql> 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=myisamPARTITION 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: 0mysql> 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分区
- MySQL分区管理 - LIST分区
- mysql LIST分区
- MySQL List分区(三)
- 【Mysql】mysql表分区2 —List分区
- list分区
- MySQL表分区(2)列表分区-list
- MySQL分区--列表分区
- MySQL分区--列分区
- Mysql分区?
- mysql分区
- mysql分区
- MySQL分区
- mysql分区
- MYSQL分区
- mysql 分区
- Mysql分区
- mysql分区
- 用JS获取不到元素样式信息的"Bug"?
- linux查看系统编码和修改系统编码
- 文章标题
- Java之字符流
- 如何用C++获取运行时变量的类型
- Mysql --分区(4)List分区
- hibernate中的映射配置详解
- GEF中SelectionToolEntry,MarqueeToolEntry选中连线
- android中 将布局转换成view的三种方式
- java枚举使用详解
- Android再按一次退出程序
- Flexbox布局的重要属性
- 序列化与反序列化
- JavaScript this 关键字 理解要领