Heim  >  Artikel  >  Datenbank  >  Was soll ich tun, wenn beim Hinzufügen einer Partition in MySQL ein Fehler auftritt?

Was soll ich tun, wenn beim Hinzufügen einer Partition in MySQL ein Fehler auftritt?

青灯夜游
青灯夜游Original
2020-10-20 09:52:502031Durchsuche

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.

Was soll ich tun, wenn beim Hinzufügen einer Partition in MySQL ein Fehler auftritt?

(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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn