ALTER TABLE при условии EXISTS с MySQL

Контекст

У меня есть старая база данных с отношениями, основанными на строке (имя человека), а не на идентификаторе. Например, 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.

Какую альтернативу я могу использовать?

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

Raymond Nijland 08.02.2019 15:06

Я удалил свой ответ из-за комментария «В вашей транзакции у вас нет условия. Как вы гарантируете, что SELECT из UPDATE соответствует строке? У вас может быть old_id, отличный от null, и new_id null». .. Другими словами, ALTER ... DROP ... может произойти только тогда, когда new_id IS NULL AND old_id IS NOT NULL верен для всей таблицы?

Raymond Nijland 08.02.2019 15:44

.... Ваш вопрос на самом деле не так ясен. Я предлагаю вам предоставить примеры данных и ожидаемые результаты. Чтобы предоставить те, которые я советую прочитать Почему я должен предоставлять MCVE для того, что мне кажется очень простым SQL-запросом?

Raymond Nijland 08.02.2019 15:44

@RaymondNijland Я отредактировал свой вопрос, чтобы он был более конкретным.

nowox 08.02.2019 15:57
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
4
118
0

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