MySQL перемещает первичный ключ из varchar в int

У меня есть три таблицы в MySQL (innodb) (X, Y и Z). X является таблицей с более чем 10 миллионами строк и имеет первичный ключ Y в качестве внешнего ключа. Аналогично, Z - это таблица с более чем 30 миллионами строк, и первичный ключ Y имеет внешний ключ.

Теперь проблема в том, что первичным ключом Y является VARCHAR (что-то вроде хеша md5 или GUID). Я хочу переместить этот ключ в INT (AUTO_INCREMENT). Как можно добиться этого в MySQL без написания сценария на каком-либо другом языке?

Кроме того, первичный ключ таблицы Z также является VARCHAR (md5/GUID). Я хотел бы также изменить это на целое число. (Это не внешний ключ в любой таблице).

2 ответа

Решение

(Это может или не может быть лучше, чем предложение Ритоброто.)

Предполагая, что X ссылается на Y. (При необходимости адаптируйте для всех FK.)

  1. Сделайте что-то подобное для каждой таблицы.

    ALTER TABLE X DROP FOREIGN KEY..., - мы добавим его позже позже ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT, - Замена PK DROP PRIMARY KEY, - Предполагается, что это было guid ADD PRIMARY KEY(id), ADD INDEX(X_guid), - Потерял FK; еще (пока) нужен индекс ADD COLUMN Y_id INT UNSIGNED NOT NULL - будущее FK для Y;

  2. Получить новый ids связаны (заменить guids). Для каждой ссылки:

    ОБНОВЛЕНИЕ X СОЕДИНЕНИЕ Y ВКЛ X.Y_guid = Y.guid SET x.y_id = y.id; (Это займет много времени.

  3. Восстановить ФК. Для каждой таблицы:

    ALTER TABLE... ДОБАВИТЬ ИНОСТРАННЫЙ КЛЮЧ..., - связать id вместо guid DROP INDEX(X_guid); - если вам это не нужно для чего-то другого

Практикуйте это на тестовой машине!

Шаг 1
Создайте таблицы с одинаковыми именами столбцов, но тип данных первичного ключа Y должен быть в INT AUTO INCREMENTТо же самое касается таблицы Z.

Шаг 2
Используйте этот запрос:

INSERT INTO table_name (column_names of present table except the primary key column_name) SELECT all the columns except the primary key column FROM Y/Z(which ever table you want from the data to be inserted).

Тогда вы можете оставить оригинальный стол.
Для такого количества данных это болезненный процесс, но он будет делать то, что вы хотели.

Другие вопросы по тегам