MySQL-Fehler beim Hinzufügen einer Partition, der Grund, warum der Fehler „1503“ gemeldet wird: Die Spalten in der Formel in jeder Partitionstabelle müssen im Primärschlüssel „eindeutiger Schlüssel“ enthalten sein, andernfalls wird ein Fehler gemeldet: Verwenden Sie den „PRIMARY KEY“-Schlüssel zuerst Erstellen Sie einen zusammengesetzten Primärschlüssel, fügen Sie das Partitionsfeld zum Primärschlüssel hinzu und führen Sie dann den Partitionsvorgang aus.
(Empfohlenes Tutorial: MySQL-Video-Tutorial)
Wenn das Partitionsfeld nicht im Primärschlüsselfeld enthalten ist, z. B. der Primärschlüssel von Tabelle A ist ID und das Partitionsfeld ist Erstellungszeit, Partitionierung nach Zeitbereich, der Code lautet wie folgt:
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);
Fehlermeldung: #1503
A PRIMARY KEY MUST INCLUDE ALL COLUMNS IN THE TABLE'S PARTITIONING FUNCTION
MySQL-Primärschlüsselbeschränkung, die Spalten in der Formel in jeder Partitionstabelle müssen im Primärschlüssel „eindeutiger Schlüssel“ enthalten sein
Dies wird erklärt in der offiziellen MYSQL-Dokumentation
18.5.1. Partitionierungsschlüssel, Primärschlüssel und eindeutige Schlüssel
In diesem Abschnitt wird die Beziehung von Partitionierungsschlüsseln zu Primärschlüsseln und eindeutigen Schlüsseln erläutert : Alle im Partitionierungsausdruck für eine partitionierte Tabelle verwendeten Spalten müssen Teil jedes eindeutigen Schlüssels sein, den die Tabelle haben kann.
Mit anderen Worten: Jeder eindeutige Schlüssel in der Tabelle muss jede Spalte im Partitionierungsausdruck der Tabelle verwenden Der Primärschlüssel der Tabelle, da es sich per Definition um einen eindeutigen Schlüssel handelt. Dieser spezielle Fall wird später in diesem Abschnitt erläutert.) Beispielsweise ist jede der folgenden Tabellenerstellungsanweisungen ungültig:
Das Partitionsfeld muss im Primärschlüssel enthalten sein Warum MYSQL dies berücksichtigt, erklärt CSDN Bamboo folgendermaßen:
Um die Effizienz des Primärschlüssels sicherzustellen. Andernfalls wird es offensichtlich problematischer, wenn sich eines der Elemente im selben Primärschlüsselbereich in Partition A und das andere in Partition B befindet. copyright
Lassen Sie uns die Lösung besprechen. Schließlich ist es nicht üblich, dass das Datum der Primärschlüssel in einer Tabelle ist.
Methode 1:
Fügen Sie in Übereinstimmung mit den Anforderungen von MYSQL das Partitionsfeld zum Primärschlüssel hinzu, um einen zusammengesetzten Primärschlüssel zu bilden
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);
Der Test wurde bestanden und die Partitionierung war erfolgreich.
Methode 2:
Da MYSQL das Partitionsfeld im Primärschlüssel enthalten muss, um eine Partition zu erstellen, ist es in Ordnung, beim Erstellen der Tabelle das Primärschlüsselfeld nicht anzugeben? ?
Der Test läuft wie folgt ab:
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);
Der Test wurde bestanden und die Partitionierung war erfolgreich. OK, Copyright
Fahren Sie mit dem Hinzufügen des Primärschlüssels fort
alter table t1 add PRIMARY KEY(ID)
Fehler 1503, der gleiche Fehler wie zuvor.
alter table t1 add PRIMARY KEY(ID,createtime)
Der Primärschlüssel wurde erfolgreich erstellt, aber es ist immer noch ein zusammengesetzter Primärschlüssel. Es scheint, dass es keinen anderen Weg gibt und ich dem Befehl folgen muss.
Der Primärschlüssel wurde erfolgreich erstellt. Fügen Sie die ID zur Feldeinstellung für die automatische Inkrementierung hinzu.
alter table t1 change id id int not null auto_increment; alter table t1 auto_increment=1;
Abschließend muss das MYSQL-Partitionsfeld in das Primärschlüsselfeld aufgenommen werden.
Das obige ist der detaillierte Inhalt vonWas soll ich tun, wenn beim Hinzufügen einer Partition in MySQL ein Fehler auftritt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!