Рассмотрим таблицу my_table
со столбцом id_my_table
в качестве первичного ключа с автоинкрементом
CREATE TABLE `my_table` (
`id_my_table` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`some_name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id_my_table`)
) ENGINE=InnoDB;
На этот первичный ключ ссылаются некоторые другие таблицы.
У меня есть несколько записей, и для примера предположим, что у меня есть пять из них, имеющих id_my_table
следующие значения: 1, 2, 3, 4 и 5. Из-за запроса клиента, который включает в себя конкретной последовательности из устаревшего набора данных, я обновил значения первичного ключа, чтобы они соответствовали этой последовательности.
Вот что я сделал:
ALTER TABLE `my_table` ADD COLUMN `my_old_id` INT UNSIGNED NULL AFTER `some_name`;
UPDATE `my_table` set `my_old_id` = `id_my_table`;
SET FOREIGN_KEY_CHECKS=0;
-- +100 so no duplicate error...
UPDATE `my_table` set `id_my_table` = `id_my_table` + 100;
UPDATE `my_table` set `id_my_table` = 25 where `id_my_table` = 1;
UPDATE `my_table` set `id_my_table` = 37 where `id_my_table` = 2;
UPDATE `my_table` set `id_my_table` = 58 where `id_my_table` = 3;
UPDATE `my_table` set `id_my_table` = 72 where `id_my_table` = 4;
UPDATE `my_table` set `id_my_table` = 96 where `id_my_table` = 5;
ALTER TABLE `my_table` AUTO_INCREMENT = 97;
UPDATE another_table at
INNER JOIN my_table mt on mt.my_old_id = at.reference_to_id_my_table
SET at.reference_to_id_my_table = mt.id_my_table;
SET FOREIGN_KEY_CHECKS=1;
Теперь все работает должным образом, и новые записи имеют правильную последовательность (на основе устаревшей), но...
Могу ли я продолжить как обычно? Или я перепутал какой-то внутренний индекс и не вижу потенциальной проблемы в будущем?
индексы автоматически обновляются, когда вы манипулируете ими, но вы можете проверить, насколько индекс работоспособен, и/или перестроить его.
Как проверить здоровье?
CHECK TABLE my_table
?SHOW EXTENDED INDEX from table1;
@nbk если что-то не так, то я должен увидеть что-то в столбце
Index_comment
?ON UPDATE CASCADE
в определении FK сделает то же самое, но в тысячу раз проще...