2013-01-10 49 views
0

我目前正在寻找一种让我的数据库受版本控制的方式。为了达到这个目的,我想要确定性的程序只能运行一次(相应的撤销)。MySQL分离式迁移脚本

我有一个问题,我的第一个脚本充满了小虫子。

这里有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 Community Server

+0

你怎么知道有错误 - 你得到错误/不正确的数据?你可以发布他们吗? – PinnyM

+0

你说得对,我完全忘记了,我加了它 –

+0

它可能与'DELIMTER ##'有关吗?由于分隔符不再是';',我认为第二行应该看起来像'DROP PROCEDURE IF EXISTS migration_001 ##'。 – ESG

回答

1

改变你目前正在使用错误的分隔符下降过程的

DELIMITER $$ 

DROP PROCEDURE IF EXISTS migration_001; 

的顺序。

+0

谢谢你的 –