存在
唯一键(包括主键
) ,如果存在,那么唯一键 中,必须包含分区表达式中用到的所有列不存在
唯一键 ,那么第1条
规则也就不需要遵守了不可以是 NULL
类型
相符合一定会删除分区中所有数据
,不会自动转移数据MAXVALUE
因为添加分区必须是递增的,添加此分区时要注意,此分区表示已经是最大的分区,无法在添加新的分区。-- 创建表
CREATE TABLE table_range (
a bigint(20) DEFAULT NULL,
b varchar(255) DEFAULT NULL,
c int(11) DEFAULT NULL,
d date DEFAULT NULL,
KEY m_index (a,b,c)
)
-- 创建 RANGE 表分区 按照年分区
PARTITION BY RANGE(YEAR(d)) (
PARTITION p0 VALUES LESS THAN (1900),
PARTITION p1 VALUES LESS THAN (2010),
PARTITION p2 VALUES LESS THAN MAXVALUE
);
-- 添加数据
INSERT INTO table_range VALUES (1,'1',1,'1900-01-01'), (2,'2',2,'2009-02-02'), (3,'3',3,'2019-03-03');
-- 添加表分区
-- ALTER TABLE table_range ADD PARTITION (PARTITION p3 VALUES LESS THAN (2014));
-- 清空表分区
-- ALTER TABLE table_range TRUNCATE PARTITION p1;
-- 删除表分区
-- ALTER TABLE table_range DROP PARTITION p3;
-- 查询数据 1900~2009 之间的数据,这里只会查询 p0 表分区
SELECT * FROM table_range WHERE d > 1900 AND d < 2009;
-- 指定查询 p1 表分区
SELECT * FROM table_range PARTITION (p1);
-- 创建表
CREATE TABLE table_range (
a bigint(20) DEFAULT NULL,
b varchar(255) DEFAULT NULL,
c int(11) DEFAULT NULL,
d date DEFAULT NULL,
KEY m_index (a,b,c)
)
-- 创建 RANGE 表分区 按照 年、月、日 分区
PARTITION BY RANGE(TO_DAYS(d)) (
PARTITION p0 VALUES LESS THAN (TO_DAYS('2017-02-01')),
PARTITION p1 VALUES LESS THAN (TO_DAYS('2017-03-01')),
PARTITION p2 VALUES LESS THAN MAXVALUE
);
-- 创建表
CREATE TABLE table_range (
a bigint(20) DEFAULT NULL,
b varchar(255) DEFAULT NULL,
c int(11) DEFAULT NULL,
d TIMESTAMP DEFAULT NULL,
KEY m_index (a,b,c)
)
-- 创建 RANGE 表分区 按照 时间戳 分区
PARTITION BY RANGE(UNIX_TIMESTAMP(d)) (
PARTITION p0 VALUES LESS THAN (UNIX_TIMESTAMP('2017-02-01 00:00:00')),
PARTITION p1 VALUES LESS THAN (UNIX_TIMESTAMP('2017-03-01 00:00:00')),
PARTITION p2 VALUES LESS THAN MAXVALUE
);
SELECT
PARTITION_NAME AS '分区名称',
FROM_DAYS(PARTITION_DESCRIPTION) AS '原分区条件',
PARTITION_EXPRESSION AS '分区表达式',
PARTITION_DESCRIPTION AS '分区条件',
TABLE_ROWS AS '分区中数据行数'
FROM
INFORMATION_SCHEMA.PARTITIONS
WHERE
TABLE_SCHEMA = 'prd2_pfizer'
AND TABLE_NAME = 'dc_flowdata_deliver_sale_range';
使用 Hash 分区时,需要在 CREATE TABLE 后面添加 PARTITION BY HASH (expr),其中 expr 是一个返回整数的表达式。当这一列的类型是整数类型时,它可以是一个列名。此外,你很可能还需要加上 PARTITIONS num,其中 num 是一个正整数,表示将表划分多少分区。
-- 创建表
CREATE TABLE table_hash (
a bigint(20) DEFAULT NULL,
b varchar(255) DEFAULT NULL,
c int(11) DEFAULT NULL,
d date DEFAULT NULL,
KEY m_index (a,b,c)
)
-- 创建 HASH 表分区
PARTITION BY HASH(YEAR(d))
PARTITIONS 6;
-- 添加数据
INSERT INTO table_hash VALUES (1,'1',1,'1900-01-01'), (2,'2',2,'2009-02-02'), (3,'3',3,'2019-03-03');
案例
CREATE TABLE `dc_flowdata` (
`distributor_code` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT '客户编码',
`distributor_name` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT '客户名称',
`specification` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT '产品规格',
`manufacturer` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT '生产厂家',
`lot_no` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT '产品批号',
`expiry_date` date DEFAULT NULL COMMENT '有效期',
`paas_create_ntid` varchar(32) COLLATE utf8_general_ci DEFAULT '' COMMENT '创建人NTID',
`paas_update_ntid` varchar(32) COLLATE utf8_general_ci DEFAULT '' COMMENT '修改人NTID',
PRIMARY KEY (`biz_date`,`paas_id`),
KEY `index1` (biz_date,paas_is_del,normal_product_code,normal_organ_code,br_status,distributor_code,normal_inventory_state),
KEY `index_source_file_id` (`source_file_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='库存数据'
PARTITION BY RANGE(TO_DAYS(biz_date)) (
PARTITION p200001 VALUES LESS THAN ( TO_DAYS('2000-01-01 00:00:00') ),
PARTITION p201701 VALUES LESS THAN ( TO_DAYS('2017-02-01 00:00:00') ),
PARTITION p201702 VALUES LESS THAN ( TO_DAYS('2017-03-01 00:00:00') ),
PARTITION p201703 VALUES LESS THAN ( TO_DAYS('2017-04-01 00:00:00') ),
PARTITION p201704 VALUES LESS THAN ( TO_DAYS('2017-05-01 00:00:00') ),
PARTITION p201705 VALUES LESS THAN ( TO_DAYS('2017-06-01 00:00:00') ),
PARTITION p201706 VALUES LESS THAN ( TO_DAYS('2017-07-01 00:00:00') )
);
只有以下函数可以用于分区表达式:
ABS()
CEILING() (see CEILING() and FLOOR())
DATEDIFF()
DAY()
DAYOFMONTH()
DAYOFWEEK()
DAYOFYEAR()
EXTRACT() (see EXTRACT() function with WEEK specifier)
FLOOR() (see CEILING() and FLOOR())
HOUR()
MICROSECOND()
MINUTE()
MOD()
MONTH()
QUARTER()
SECOND()
TIME_TO_SEC()
TO_DAYS()
TO_SECONDS()
UNIX_TIMESTAMP() (with TIMESTAMP columns)
WEEKDAY()
YEAR()
YEARWEEK()