我们改变了数据结构。因此,我们需要向表中添加更多列,用一些现有列中的数据自动填充它们,并删除一些旧列。这应该是一项简单的任务。
背景:我们正在使用 Flyway 进行数据库迁移的 Spring Boot 3 应用程序。在本地(以及用于单元测试),我们使用 H2 InMemory 数据库,该数据库将在每次启动时重新创建。在云环境中,我们使用 MySQL8 数据库。
我对迁移脚本的想法是:
我首先实现了该脚本并在本地进行了尝试(H2)。它遇到了 org.h2.jdbc.JdbcSQLSyntaxErrorException 因为 Flyway 似乎无法识别
delimiter $$
语句。但是在MySQL数据库的环境中测试脚本,它工作正常。
脚本看起来像这样(删除了工作部分):
delimiter $$
create procedure migrate_services()
begin
declare finished boolean default false;
-- declaring more variables
declare cur_services cursor for select /* the fields to use */
from services;
declare continue handler for not found set finished = true;
open cur_services;
process_service :
loop
if finished = true then
leave process_service;
end if;
fetch cur_services into /* the above declared variables */;
/* computing data to be written into the new columns */
update services
set /* setting new data */
where uuid = current_uuid;
end loop;
close cur_services;
end$$
delimiter ;
我尝试了一些不同的分隔符。我尝试删除分隔符。我花了一个下午的时间在谷歌上搜索这个问题,但没有找到合适的解决方案。
您正在 Spring Boot 3 中创建存储过程?尝试省略
DELIMITER
命令并将 CREATE PROCEDURE
语句作为单个命令执行。
仅在使用命令行客户端时才需要
DELIMITER
命令。它用于将不同的 SQL 命令相互分隔并更改默认的分号分隔符,因为过程内部使用分号。