MySQL 确定性迁移脚本

标签 mysql sql stored-procedures database-versioning

我目前正在寻找一种方法来对我的数据库进行版本控制。为了实现这一目标,我希望有一个只能运行一次的确定性过程(带有相应的撤消操作)。

我在构建第一个脚本时遇到问题,该脚本充满了小错误。

以下是 3 个主要部分:

执行查询的条件(如果字段不存在)

SELECT *
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'my_database'
  AND TABLE_NAME = 'my_table'
  AND COLUMN_NAME = 'full_name'

表格更改:

ALTER TABLE
  my_table
  ADD full_name VARCHAR(255) NOT NULL;

最后是数据迁移

UPDATE candidat dest JOIN candidat src ON dest.id = src.id
      SET dest.full_name = CONCAT(src.first_name, ' ', IF(src.middle_name='', '', CONCAT(src.middle_name, ' ')), src.last_name);

我正在尝试以这种形式完成这项工作:

DELIMITER $$
DROP PROCEDURE IF EXISTS migration_001;

CREATE PROCEDURE migration_001()

BEGIN
  IF NOT EXISTS (
    SELECT *
    FROM information_schema.COLUMNS
    WHERE TABLE_SCHEMA = 'my_database'
      AND TABLE_NAME = 'my_table'
      AND COLUMN_NAME = 'full_name') 
   THEN

     ALTER TABLE
      my_table
      ADD full_name VARCHAR(255) NOT NULL;

    UPDATE candidat dest JOIN candidat src ON dest.id = src.id
          SET dest.full_name = CONCAT(src.first_name, ' ', IF(src.middle_name='', '', CONCAT(src.middle_name, ' ')), src.last_name);
  END IF
END;
$$

我收到的当前错误:

1064 : ...  right syntax to use near 'CREATE PROCEDURE migration_001() BEGIN IF NOT EXISTS ( SELECT * ' at line 3

有人能指出我解决这个问题的正确方向吗?

顺便说一句,我正在使用 5.5.16-log - MySQL 社区服务器

最佳答案

更改顺序

DELIMITER $$

DROP PROCEDURE IF EXISTS migration_001;

当前您使用了错误的分隔符来删除该过程。

关于MySQL 确定性迁移脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14267018/

相关文章:

c# - 从代码测试存储过程是否为 "Parse"/"Compile"

sql-server - 使用一个接受可变数量参数的存储过程是一种好习惯吗

MySQL存储过程从秒查询返回变量值?

java - MySql 存储过程数字增量器

php - mysql+php 减去两次并显示差值

mysql - Hibernate转义 ":"字符

java:显示数据库中的元素

sql - BigQuery : Xoring Elements of Two Arrays

mysql - 可以跨表索引吗?

mysql - SQL连接三张表(一张是关系表)