2011-05-19 3 views
3

Je dois partitionner une table MySQL parmi les données temporelles (le champ commence dans le tableau suivant).Modification de la clé primaire AUTO_INCREMENT pour le partitionnement

CREATE TABLE `table1` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `fk_id` bigint(20) NOT NULL, 
    `begin` bigint(20) NOT NULL,  
    PRIMARY KEY (`id`), 
    KEY `FK1E57078DB20EC268` (`fk_id`) 
) ENGINE=MyISAM AUTO_INCREMENT=10443288 DEFAULT CHARSET=latin1 

Lorsque je tente de partition comme ceci:

alter table table1 partition by range (begin) (
PARTITION until_2010_07 VALUES LESS THAN (1280620800000), 
PARTITION 2010_08 VALUES LESS THAN (1283299200000), 
PARTITION 2010_09 VALUES LESS THAN (1285891200000), 
PARTITION 2010_10 VALUES LESS THAN (1288569600000), 
PARTITION 2010_11 VALUES LESS THAN (1291161600000), 
PARTITION 2010_12 VALUES LESS THAN (1293840000000), 
PARTITION from_2011 VALUES LESS THAN MAXVALUE 
); 

J'obtiens une erreur MySQL: ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function

Si je comprends bien le mysql doc, une colonne de partitionnement devrait appartient à la clé primaire . Le problème pour moi est que je veux changer le PRIMARY_KEY pour être un composé PRIMARY KEY ('id','fk_id','begin') sans changer les colonnes id existantes (parce que c'est un champ qui est utilisé dans l'application pour générer des URL bookmarkable, donc renuméroter les ID n'est pas une option

Comment puis-je modifier PRIMARY_KEY afin de pouvoir effectuer mon partitionnement?

Répondre

8

j'ai finalement trouvé une façon de le faire, je réponds au nom d'autres personnes qui viennent à travers cette question

//drop auto_increment capability 
alter table table1 change column id id BIGINT NOT NULL; 
//in one line, drop primary key and rebuild one 
alter table table1 drop primary key, add primary key(id,fk_id,begin); 
//re add the auto_increment capability, last value is remembered 
alter table table1 change column id id BIGINT NOT NULL AUTO_INCREMENT; 
//build the partition 
alter table table1 partition by range (begin) ( 
    PARTITION until_2010_07 VALUES LESS THAN (1280620800000), 
    PARTITION 2010_08 VALUES LESS THAN (1283299200000), 
    PARTITION 2010_09 VALUES LESS THAN (1285891200000), 
    PARTITION 2010_10 VALUES LESS THAN (1288569600000), 
    PARTITION 2010_11 VALUES LESS THAN (1291161600000), 
    PARTITION 2010_12 VALUES LESS THAN (1293840000000), 
    PARTITION from_2011 VALUES LESS THAN MAXVALUE 
); 

Cloisonnement est en effet vraiment facile, mais je les gens des conseils de penser à ce sujet lors de la création du clé primaire avant d'utiliser effectivement leur base de données dans la production :-)

Chaque étape prend 3 minutes sur mon ordinateur portable, alors je vais devoir arrêter le service pour maintenir la cohérence dans ma base de données

+0

Pourquoi avez-vous besoin de laisser tomber la incrémentation automatique? Ne devriez-vous pas être en mesure de laisser tomber sa clé primaire tout en conservant l'incrément automatique? –

Questions connexes