2012-01-14 6 views
1

L'instruction CREATE TABLE suivante pour partitionner une table fonctionne comme prévu, sans erreur.partitions et sous-partitions

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')) 
); 

Ce que je dois faire est de créer des sous-partitions basées sur date + zoneid. J'ai essayé les éléments suivants:

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

Insertion dans ce tableau:

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

résultats dans l'erreur suivante:

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

Ma requête prévoit utiliser la sous-partition IDZone en fonction des dates. C'est possible?

+0

Développer sur "ne fonctionne pas comme prévu". Qu'attendez-vous? Qu'est-ce qui se passe réellement? – outis

+0

Impossible d'insérer des enregistrements dans cette table # insert dans les valeurs mypart (1, 2, 3, '2012-01-31 04:10:03'); # ERREUR 1526 (HY000): La table n'a pas de partition pour la valeur 734898 – shantanuo

+0

Veuillez mettre à jour la question avec le message d'erreur. En général, répondez aux demandes de clarifications en mettant à jour votre message, plutôt que de répondre par un commentaire. D'une part, une question devrait être compréhensible sans lire les commentaires. Pour un autre, SO est un AQ et un site, pas un forum, et les commentaires ne sont pas destinés (et ne sont pas bien adaptés) pour les discussions. – outis

Répondre

4

Contrairement à votre affirmation selon laquelle la première table fonctionne sans erreur, en insérant les données d'échantillon dans le:

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

résultats dans la même erreur que pour la deuxième table. La valeur donnée dans l'erreur (734898) se trouve être la valeur pour to_days('2012-01-31'). Vous obtenez cette erreur car vous avez seulement des partitions pour le 1er janvier st à 3 rd, 2010. Le jour du mois et l'année pour les exemples de données sont en dehors des partitions définies. Au lieu de TO_DAYS (qui renvoie le nombre de jours de l'année 0 à la date donnée), vous voulez probablement DAYOFMONTH. Puisque chaque partition est contiguë, une partition RANGE semble plus appropriée qu'une LIST. Hors sujet, il vous suffit de spécifier des définitions de sous-partition séparées lorsque vous souhaitez définir des options pour les sous-partitions. Puisque vous ne le faites pas, une clause SUBPARTITIONS 2 fera la même chose que votre déclaration, mais elle est plus simple.

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