分区表的以下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');
导致以下错误:
错误1526(HY000):表没有值734898的分区
我的查询期望根据日期使用zoneid子分区。有可能吗?
答案 0 :(得分: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的分区。样本数据的日期和年份都在定义的分区。您可能需要DAYOFMONTH
,而不是TO_DAYS
(返回从第0年到指定日期的天数)。由于每个分区都是连续的,因此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,
...
);