У меня есть старая база данных с отношениями, основанными на строке (имя человека), а не на идентификаторе. Например, person имеет множество соединений comments по столбцу person_name в таблице comments.
Я хотел бы исправить это, изменив столбец person_name на person_id.
Он состоит из создания нового столбца person_id на comments и обновления значения:
UPDATE comments SET
person_id = (SELECT id FROM people WHERE LOWER(person_name) = name);
Я не могу просто сбросить person_name и обновить внешние ключи. Мне нужно убедиться, что все комментарии правильно связаны с их авторами. Просто выбрав все комментарии с person_name, но пустым person_id, я могу поднять красный флаг, потому что эта миграция будет применена автоматически ко многим таблицам.
SELECT 1 FROM comments WHERE person_id IS NULL AND person_name IS NOT NULL
Обратите внимание, что некоторые комментарии анонимны, поэтому person_name может быть NULL.
Чтобы сделать это атомарно, я мог бы сделать:
IF EXISTS(SELECT 1 FROM comments WHERE person_id IS NULL AND person_name IS NOT NULL)
THEN
ALTER TABLE comments
DROP COLUMN person_name;
END IF;
К сожалению, это работает только с MSSQL, а не с MySQL.
Какую альтернативу я могу использовать?
Я удалил свой ответ из-за комментария «В вашей транзакции у вас нет условия. Как вы гарантируете, что SELECT из UPDATE соответствует строке? У вас может быть old_id, отличный от null, и new_id null». .. Другими словами, ALTER ... DROP ... может произойти только тогда, когда new_id IS NULL AND old_id IS NOT NULL верен для всей таблицы?
.... Ваш вопрос на самом деле не так ясен. Я предлагаю вам предоставить примеры данных и ожидаемые результаты. Чтобы предоставить те, которые я советую прочитать Почему я должен предоставлять MCVE для того, что мне кажется очень простым SQL-запросом?
@RaymondNijland Я отредактировал свой вопрос, чтобы он был более конкретным.






Вы пытаетесь выполнить синтаксис SQL Server (MSSQL) в MySQL. MySQL не поддерживает управление потоком, подобное этому, в простых запросах, что вы можете сделать, это переписать его в хранимую процедуру, где MySQL поддерживает управление потоком.