2012-01-14 2 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')) 
); 

Что мне нужно сделать, так это создать дочерние элементы на основе даты + 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 января 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, 
     ... 
); 
Смежные вопросы