Pude adaptar estas instrucciones: tomar una tabla con una clave primaria sin incremento existente , agregar una clave primaria incremental a la tabla y crear una nueva clave primaria compuesta con las claves antiguas y nuevas como clave principal compuesta usando lo siguiente código:
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 );
Cuando se hace esto, el campo _USER_ID existe y tiene todos los valores numéricos para la clave primaria exactamente como cabría esperar. Con la "TABLA DE GOTAS" en la parte superior, puede ejecutar esto una y otra vez para experimentar con variaciones.
Lo que no he podido hacer funcionar es la situación en la que hay CLAVES EXTRANJERAS entrantes que ya apuntan al campo USER_ID. Recibo este mensaje cuando intento hacer un ejemplo más complejo con una clave externa entrante de otra tabla.
#1025 - Error on rename of './zap/#sql-da07_6d' to './zap/SAKAI_USER_ID_MAP' (errno: 150)
Supongo que necesito eliminar todas las claves foráneas antes de hacer la tabla ALTER y luego reconstruirlas después. Pero por ahora quería compartir esta solución con una versión más desafiante de la pregunta original en caso de que otros se encontraran con esta situación.
alter table
para agregar la clave, pero MySQL no generará ID para los campos que aún no los tienen. Tendrá que actualizar manualmente los campos existentes y luego asegurarse de que su nuevo auto_increment comience en el desplazamiento correcto: el valor predeterminado es '1' y de todos modos terminará con errores de clave duplicados.