Maison >base de données >tutoriel mysql >Que dois-je faire s'il y a une erreur lors de l'ajout d'une partition dans MySQL ?

Que dois-je faire s'il y a une erreur lors de l'ajout d'une partition dans MySQL ?

青灯夜游
青灯夜游original
2020-10-20 09:52:502165parcourir

Erreur Mysql lors de l'ajout de partition, raison de l'erreur "1503" : Les colonnes de la formule dans chaque table de partition doivent être incluses dans la clé primaire "clé unique", sinon une erreur sera signalée ; Le mot-clé "first" PRIMARY KEY" crée une clé primaire composite, ajoute le champ de partitionnement à la clé primaire, puis effectue des opérations de partitionnement.

Que dois-je faire s'il y a une erreur lors de l'ajout d'une partition dans MySQL ?

(Tutoriel recommandé : Tutoriel vidéo mysql )

Si le champ de partition n'est pas inclus dans le champ de clé primaire , tel que table La clé primaire de A est ID, le champ de partition est createtime et il est partitionné par plage de temps. Le code est le suivant :

CREATE TABLE T1 (
     id int(8) NOT NULL AUTO_INCREMENT,
     createtime datetime NOT NULL,
      PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
PARTITION BY RANGE(TO_DAYS (createtime))
(
PARTITION p0 VALUES LESS THAN (TO_DAYS('2010-04-15')),
PARTITION p1 VALUES LESS THAN (TO_DAYS('2010-05-01')),
PARTITION p2 VALUES LESS THAN (TO_DAYS('2010-05-15')),
PARTITION p3 VALUES LESS THAN (TO_DAYS('2010-05-31')),
PARTITION p4 VALUES LESS THAN (TO_DAYS('2010-06-15')),
PARTITION p19 VALUES LESS ThAN  MAXVALUE);

Invite d'erreur : #1503

A PRIMARY KEY MUST INCLUDE ALL COLUMNS IN THE TABLE'S PARTITIONING FUNCTION
Restrictions de clé primaire MySQL, formules dans chaque table de partition Les colonnes doivent être incluses dans la clé primaire "clé unique"

Ceci est expliqué dans la documentation officielle de MYSQL


18.5.1. Clés de partitionnement, clés primaires et clés uniques


Cette section traite de la relation des clés de partitionnement avec les clés primaires et les clés uniques. La règle régissant cette relation peut être exprimée comme suit : Toutes les colonnes utilisées dans l'expression de partitionnement d'une table partitionnée doivent faire partie de chaque clé unique que la table peut avoir

En d'autres termes, chaque clé unique de la table doit utiliser chaque colonne de l'expression de partitionnement de la table (. Cela inclut également la clé primaire de la table, puisqu'il s'agit par définition d'une clé unique. Ce cas particulier est abordé plus loin dans cette section.) Par exemple, chacune des instructions de création de table suivantes n'est pas valide :

Le champ de partition doit être contenu dans le champ de clé primaire, c'est pourquoi MYSQL le considérera de cette façon :


Afin de garantir l'efficacité de la clé primaire. Sinon, ce sera évidemment plus gênant si l'un des éléments de la même zone de clé primaire se trouve dans la partition A et l'autre dans la partition B. copyright


La solution est discutée ci-dessous Après tout, il n'est pas courant que la date soit la clé primaire dans une table.

Méthode 1 :

Conformément aux exigences de MYSQL, ajoutez le champ de partition à la clé primaire pour former une clé primaire composite

CREATE TABLE T1 (
     id int(8) NOT NULL AUTO_INCREMENT,
     createtime datetime NOT NULL,
      PRIMARY KEY (id,createtime)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
PARTITION BY RANGE(TO_DAYS (createtime))
(
PARTITION p0 VALUES LESS THAN (TO_DAYS('2010-04-15')),
PARTITION p1 VALUES LESS THAN (TO_DAYS('2010-05-01')),
PARTITION p2 VALUES LESS THAN (TO_DAYS('2010-05-15')),
PARTITION p3 VALUES LESS THAN (TO_DAYS('2010-05-31')),
PARTITION p4 VALUES LESS THAN (TO_DAYS('2010-06-15')),
PARTITION p19 VALUES LESS ThAN  MAXVALUE);

Le test a réussi et la partition a réussi.

Méthode 2 :

Puisque MYSQL doit inclure le champ de partition dans la clé primaire pour créer une partition, est-il possible de ne pas spécifier le champ de clé primaire lors de la création du une table ? Du drap de laine ? ?

Le test est le suivant :

CREATE TABLE T1 (
     id int(8) NOT NULL ,
     createtime datetime NOT NULL
      ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
PARTITION BY RANGE(TO_DAYS (createtime))
(
PARTITION p0 VALUES LESS THAN (TO_DAYS('2010-04-15')),
PARTITION p1 VALUES LESS THAN (TO_DAYS('2010-05-01')),
PARTITION p2 VALUES LESS THAN (TO_DAYS('2010-05-15')),
PARTITION p3 VALUES LESS THAN (TO_DAYS('2010-05-31')),
PARTITION p4 VALUES LESS THAN (TO_DAYS('2010-06-15')),
PARTITION p19 VALUES LESS ThAN  MAXVALUE);

Le test a réussi et la partition a réussi. OK copyright

Continuer à ajouter la clé primaire

alter table t1 add PRIMARY KEY(ID)

Erreur 1503, la même erreur qu'avant.

alter table t1 add PRIMARY KEY(ID,createtime)

La clé primaire a été créée avec succès, mais il s'agit toujours d'une clé primaire composite. Il semble qu'il n'y ait pas d'autre moyen et je dois suivre la commande.

La clé primaire est créée avec succès, ajoutez l'ID aux paramètres du champ d'incrémentation automatique

alter table t1 change id id int not null auto_increment;
alter table t1 auto_increment=1;

Enfin, le champ de partition MYSQL doit être inclus dans le champ de clé primaire.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn