Ich konnte diese Anweisungen anpassen. Nehmen Sie eine Tabelle mit einem vorhandenen nicht inkrementellen Primärschlüssel, fügen Sie der Tabelle einen inkrementierenden Primärschlüssel hinzu und erstellen Sie einen neuen zusammengesetzten Primärschlüssel mit dem alten und dem neuen Schlüssel als zusammengesetzten Primärschlüssel Code:
DROP TABLE IF EXISTS SAKAI_USER_ID_MAP;
CREATE TABLE SAKAI_USER_ID_MAP (
USER_ID VARCHAR (99) NOT NULL,
EID VARCHAR (255) NOT NULL,
PRIMARY KEY (USER_ID)
);
INSERT INTO SAKAI_USER_ID_MAP VALUES ('admin', 'admin');
INSERT INTO SAKAI_USER_ID_MAP VALUES ('postmaster', 'postmaster');
ALTER TABLE SAKAI_USER_ID_MAP
DROP PRIMARY KEY,
ADD _USER_ID INT AUTO_INCREMENT NOT NULL FIRST,
ADD PRIMARY KEY ( _USER_ID, USER_ID );
Wenn dies erledigt ist, existiert das Feld _USER_ID und enthält alle Zahlenwerte für den Primärschlüssel genau wie erwartet. Mit der "DROP TABLE" oben können Sie dies immer wieder ausführen, um mit Variationen zu experimentieren.
Was ich nicht zum Laufen bringen konnte, ist die Situation, in der eingehende AUSLÄNDISCHE SCHLÜSSEL vorhanden sind, die bereits auf das Feld USER_ID verweisen. Ich erhalte diese Meldung, wenn ich versuche, ein komplexeres Beispiel mit einem eingehenden Fremdschlüssel aus einer anderen Tabelle zu erstellen.
#1025 - Error on rename of './zap/#sql-da07_6d' to './zap/SAKAI_USER_ID_MAP' (errno: 150)
Ich vermute, dass ich alle Fremdschlüssel abreißen muss, bevor ich die ALTER-Tabelle mache, und sie anschließend neu erstellen muss. Aber jetzt wollte ich diese Lösung mit einer herausfordernderen Version der ursprünglichen Frage teilen, falls andere in diese Situation geraten sollten.
alter table
den Schlüssel problemlos hinzufügen, aber MySQL generiert keine IDs für Felder, die diese noch nicht haben. Sie müssen die vorhandenen Felder manuell aktualisieren und dann sicherstellen, dass Ihr neues auto_increment mit dem richtigen Versatz beginnt. Der Standardwert ist "1", und Sie erhalten sowieso nur doppelte Schlüsselfehler.