2012-01-14 10 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

+0

このテーブルにレコードを挿入できません。#mypart値に挿入します(1,2,3、 '2012-01-31 04:10:03'); #ERROR 1526(HY000):テーブルに値734898のパーティションがありません – shantanuo

+0

エラーメッセージで質問を更新してください。一般的に、コメントで返信するのではなく、あなたの投稿を更新することによって、明確化の要求に応えます。一つのこととして、コメントを読まなければ問題は理解できるはずです。別の例として、SOはQAとサイトであり、フォーラムではなく、コメントは意図されておらず(また、適切ではない)、議論のためのものでもありません。 – outis

答えて

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, 
     ... 
);