Мне удалось адаптировать эти инструкции, взять таблицу с существующим первичным ключом без инкремента, добавить добавочный первичный ключ в таблицу и создать новый составной первичный ключ со старым и новым ключами в качестве составного первичного ключа, используя следующие код:
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 );
Когда это сделано, поле _USER_ID существует и содержит все числовые значения для первичного ключа в точности так, как вы ожидаете. С «DROP TABLE» вверху вы можете запускать это снова и снова, чтобы экспериментировать с вариациями.
То, что я не смог заставить работать, - это ситуация, когда есть входящие FOREIGN KEY, которые уже указывают на поле USER_ID. Я получаю это сообщение, когда пытаюсь сделать более сложный пример с входящим внешним ключом из другой таблицы.
#1025 - Error on rename of './zap/#sql-da07_6d' to './zap/SAKAI_USER_ID_MAP' (errno: 150)
Я предполагаю, что мне нужно разрушить все внешние ключи перед выполнением таблицы ALTER, а затем восстановить их. Но сейчас я хотел бы поделиться этим решением с более сложной версией исходного вопроса на случай, если другие столкнутся с этой ситуацией.
alter table
чтобы добавить ключ, но MySQL не будет генерировать идентификаторы для полей, у которых их еще нет. Вам нужно будет вручную обновить существующие поля, а затем убедиться, что ваш новый auto_increment начинается с правого смещения - по умолчанию он равен «1», и в любом случае вы просто получите ошибки дублирующихся ключей.