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
。
你怎么知道有错误 - 你得到错误/不正确的数据?你可以发布他们吗? – PinnyM
你说得对,我完全忘记了,我加了它 –
它可能与'DELIMTER ##'有关吗?由于分隔符不再是';',我认为第二行应该看起来像'DROP PROCEDURE IF EXISTS migration_001 ##'。 – ESG