gpt4 book ai didi

mysql - 有条件地中止 MySQL 脚本

转载 作者:行者123 更新时间:2023-11-29 02:37:58 25 4
gpt4 key购买 nike

给定:MySQL 数据库。有时会推出数据库架构更改和更新(以 sql 脚本的形式)。为了保证应用更新的正确顺序(没有重复更新、没有更新丢失等),我计划部署以下解决方案:

  • CREATE TABLE meta (name TEXT PRIMARY KEY, val TEXT);
  • INSERT INTO meta VALUES ('version','0');

每个更新脚本都带有一个按顺序分配的版本 N。在执行更新之前,脚本会检查 meta.version 是否与之前的脚本版本 N-1 匹配。执行更新后,meta.version 更新为 N。我不需要防止多个脚本并行运行。

问题:如何检查版本并在不匹配时中止脚本?我发现执行

CALL `raise error`

会破坏脚本,但如何根据 meta.version 有条件地执行它?不允许存储过程。有意义的错误消息是一个加号。 This没有提供合适的解决方案。

最佳答案

我认为最好在 shell 脚本或安装程序中解决这个问题。您实际上不能在 SQL 脚本中有任何控制结构。

一个非常简单的解决方案是创建一个脚本,该脚本根据元表上的选择生成要执行的实际脚本的命令行。

假设您有这个脚本,gen_upgrade_command.sql:

select concat(
'mysql -u<user> -p<password> -h<host> -e"SOURCE upgrade'
, val + 1
, '.sql"'
)
from meta;

你是这样跑的

mysql -u<user> -p<password> -h<host> -Nrs < gen_upgrade_command.sql > do_upgrade.bat

现在,do_upgrade.bat 包含这个生成的命令行:

mysql -u<usere> -p<password> -h<host> -e"SOURCE upgrade1.sql"

并运行 do_upgrade.bat 将运行 upgrade1.sql

当然,您也可以修改原始脚本以完全不选择任何行,这完全取决于您。

关于mysql - 有条件地中止 MySQL 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2012039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com