我目前正在寻找一种方法来对我的数据库进行版本控制。为了实现这一目标,我希望有一个只能运行一次的确定性过程(带有相应的撤消操作)。
我在构建第一个脚本时遇到问题,该脚本充满了小错误。
以下是 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/