MySQL确定性迁移脚本

时间:2013-01-10 20:49:10

标签: 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

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

BTW我正在使用5.5.16-log - MySQL Community Server

1 个答案:

答案 0 :(得分:1)

更改

的顺序
DELIMITER $$

DROP PROCEDURE IF EXISTS migration_001;

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