2012-01-14 93 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, 
     ... 
);