2012-01-14 84 views
1

以下CREATE TABLE语句对分区表按预期工作,没有错误。分区和子分区

CREATE TABLE `ox_data_archive_20120108` (
    `id` bigint(20) unsigned NOT NULL, 
    `creativeid` int unsigned NOT NULL, 
    `zoneid` int unsigned NOT NULL, 
    `datetime` datetime NOT NULL 
) PARTITION BY LIST(to_days(datetime)) (
     PARTITION `1Jan10` VALUES IN (to_days('2010-01-01')), 
     PARTITION `2Jan10` VALUES IN (to_days('2010-01-02')), 
     PARTITION `3Jan10` VALUES IN (to_days('2010-01-03')) 
); 

我需要做的是根据date + zoneid创建子分区。我试过如下:

CREATE TABLE mypart (
    `id` bigint(20) unsigned NOT NULL, 
    `creativeid` int unsigned NOT NULL, 
    `zoneid` int unsigned NOT NULL, 
    `datetime` datetime NOT NULL 
) PARTITION BY LIST(to_days(datetime)) 
    SUBPARTITION BY KEY(zoneid) (
     PARTITION `1Jan10` VALUES IN (to_days('2010-01-01')) 
     (Subpartition s1, Subpartition s2), 
     PARTITION `2Jan10` VALUES IN (to_days('2010-01-02')) 
     (Subpartition s3, Subpartition s4), 
     PARTITION `3Jan10` VALUES IN (to_days('2010-01-03')) 
     (Subpartition s5, Subpartition s6) 
); 

插入到这个表:

INSERT INTO mypart VALUES (1, 2, 3, '2012-01-31 04:10:03'); 

导致以下错误:

ERROR 1526 (HY000): Table has no partition for value 734898

我查询希望使用基于日期的子分区了zoneid。可能吗?

+0

展开“不按预期方式工作”。你能指望什么?究竟发生了什么? – outis 2012-01-14 10:21:40

+0

无法在此表中插入记录#insert into mypart values(1,2,3,'2012-01-31 04:10:03'); #错误1526(HY000):表没有值的分区734898 – shantanuo 2012-01-14 11:29:14

+0

请更新带有错误消息的问题。一般而言,通过更新您的帖子来回应澄清请求,而不是回复评论。首先,如果没有阅读评论,一个问题应该是可以理解的。另一方面,SO是一个质量保证和网站,而不是一个论坛,评论意图不适合(也不适合)讨论。 – outis 2012-01-14 11:47:18

回答

4

出乎你的说法,第一个表而不会出现错误,样本数据插入到它:

INSERT INTO `ox_data_archive_20120108` VALUES (1, 2, 3, '2012-01-31 04:10:03'); 

导致同样的错误作为第二个表。错误(734898)中给出的值恰好是to_days('2012-01-31')的值。你得到这个错误是因为你只有1月1日st到3 rd 2010的分区。样本数据的月份和年份都在定义的分区之外。而不是TO_DAYS(它返回从第0年到给定日期的天数),您可能需要DAYOFMONTH。由于每个分区都是连续的,所以RANGE分区似乎比LIST更合适。

偏离主题,当您需要为子分区设置选项时,只需指定单独的子分区定义。既然你没有这样做,SUBPARTITIONS 2条款将做你的声明相同的事情,但更简单。

CREATE TABLE mypart (
    `id` bigint(20) unsigned NOT NULL, 
    `creativeid` int unsigned NOT NULL, 
    `zoneid` int unsigned NOT NULL, 
    `datetime` datetime NOT NULL 
) PARTITION BY RANGE(DAYOFMONTH(`datetime`)) 
    SUBPARTITION BY KEY(zoneid) 
    SUBPARTITIONS 2 (
     PARTITION `01` VALUES LESS THAN 2, -- Note: 0 is valid day-of-month 
     PARTITION `02` VALUES LESS THAN 3, 
     PARTITION `03` VALUES LESS THAN 4, 
     ... 
);