J'ai pu adapter ces instructions à une table avec une clé primaire non incrémentielle existante , et ajouter une clé primaire incrémentielle à la table et créer une nouvelle clé primaire composite avec les anciennes et les nouvelles clés en tant que clé primaire composite en utilisant ce qui suit 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 );
Lorsque cela est fait, le champ _USER_ID existe et contient toutes les valeurs numériques de la clé primaire exactement comme vous le souhaitez. Avec le "DROP TABLE" en haut, vous pouvez l'exécuter encore et encore pour expérimenter des variations.
Ce que je n'ai pas pu obtenir, c'est la situation où il y a des clés étrangères entrantes qui pointent déjà vers le champ USER_ID. Je reçois ce message lorsque j'essaye de faire un exemple plus complexe avec une clé étrangère entrante d'une autre table.
#1025 - Error on rename of './zap/#sql-da07_6d' to './zap/SAKAI_USER_ID_MAP' (errno: 150)
Je suppose que je dois détruire toutes les clés étrangères avant de faire la table ALTER, puis les reconstruire par la suite. Mais pour l'instant, je voulais partager cette solution à une version plus difficile de la question originale au cas où d'autres se retrouveraient dans cette situation.
alter table
pour ajouter la clé, mais MySQL ne générera pas d'ID pour les champs qui ne les ont pas déjà. Vous devrez mettre à jour manuellement les champs existants, puis vous assurer que votre nouvel auto_increment commence au bon décalage - il vaut par défaut '1' et vous vous retrouverez de toute façon avec des erreurs de clé en double.