есть поле user_id, которое по историческим причинам является varchar(255) и не является внешним ключом. Я бы хотел конвертнуть это поле в BIGINT, но нюанс в том, что табличка часто под нагрузкой, и хотелось бы избежать длительных блокировок. Хочу сделать это так за одну транзакцию:
ALTER TABLE secret_table ADD COLUMN user_id_2 BIGINT;
UPDATE secret_table SET user_id_2 = user_id::bigint WHERE user_id IS NOT NULL;
ALTER TABLE secret_table DROP COLUMN user_id;
ALTER TABLE secret_table RENAME COLUMN user_id_2 TO user_id;
Не будет ли здесь блокировок ( беспокоит add column больше всего ) ?
Поле user_id изначально почти во всех строках null ( тех строк, где оно не null менее <100 )
На Fosdem 2021 был доклад на тему замены тип данных, поищите.
Главное, избежать длинных транзакций и делать по очереди. «Быстренько» добавьте новое поле. Только потом вешайте на него default какой надо. Потом потихоньку заполните. Потом в одной транзакции переименовать поля.
Обсуждают сегодня