Flyway | MariaDb - 无法执行条件块

时间:2017-08-02 10:11:37

标签: mysql mariadb flyway

我想在包含现有数据的表中添加一个非空列。我的工具包包括MariaDb和flyway。这就是我正在做的事情

IF NOT EXISTS(SELECT 1
                FROM INFORMATION_SCHEMA.COLUMNS
                WHERE table_name = 'MY_DATA_TABLE'
                AND table_schema = '${schemaName}'
                AND column_name = 'NewColumnName'
              ) THEN
        ALTER TABLE MY_DATA_TABLE ADD COLUMN 'NewColumnName' INT;
        SELECT ID INTO @val FROM MASTER_TABLE WHERE lower(Name) = 'XYZ';
        UPDATE MY_DATA_TABLE SET NewColumnName = @val;
        ALTER TABLE MY_DATA_TABLE MODIFY COLUMN 'NewColumnName' INT NOT NULL;
END IF;

执行mvn flyway:migrate给了我这个错误

[ERROR] SQL State  : 42000
[ERROR] Error Code : 1064
[ERROR] Message    : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''NewColumnName'
INT' at line 7

我甚至尝试在内部放置一些运行的select语句,但错误仍然相同。请提出一些解决方法。如果有其他方法可以实现目标,也请建议。 谢谢!

2 个答案:

答案 0 :(得分:0)

我怀疑问题在于引用列名。尝试以交互方式执行SQL,看看是否收到相同的错误。然后尝试让它成功运作。在related question中,答案是在列名称周围不使用引号或使用反向标记来转义它们。

答案 1 :(得分:0)

这里是我如何达到目标的。

DROP PROCEDURE IF EXISTS `proc_UpdateMyColumn`;
DELIMITER //

CREATE PROCEDURE `proc_UpdateMyColumn`
(
)
BEGIN
    DECLARE valueToSet INT;

    IF NOT EXISTS (SELECT 1
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE table_name = 'MY_DATA_TABLE'
        AND table_schema = '${schemaName}'
        AND column_name = 'NewColumnName'
    ) THEN
        ALTER TABLE MY_DATA_TABLE ADD COLUMN NewColumnName INT;
        SELECT ID INTO valueToSet FROM MASTER_TABLE WHERE lower(Name) = 'XYZ';
        UPDATE MY_DATA_TABLE SET NewColumnName = valueToSet;
        ALTER TABLE MY_DATA_TABLE MODIFY COLUMN NewColumnName INT NOT NULL;
    END IF;
END;
DELIMITER;

CALL `proc_UpdateMyColumn`();
DELIMITER;