简体   繁体   English

飞路| MariaDb-无法执行条件块

[英]Flyway | MariaDb - Unable to execute conditional block

I want to add a not null column to a table with existing data. 我想向现有数据表中添加一个非空列。 My toolset includes MariaDb and flyway. 我的工具集包括MariaDb和flyway。 Here's what I am doing 这就是我在做什么

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;

Doing mvn flyway:migrate gives me this error 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

I even tried placing some running select statement inside, but the error remains the same. 我什至尝试在其中放置一些正在运行的select语句,但错误仍然相同。 Please suggest some workaround. 请提出一些解决方法。 Please also recommend if there's another way to achieve the objective. 如果存在另一种实现目标的方法,也请提出建议。 Thanks! 谢谢!

I suspect the issue is with quoting the column name. 我怀疑问题出在引用列名。 Try executing the SQL interactively and see if you get the same error. 尝试以交互方式执行SQL,看看是否遇到相同的错误。 Then try and get it working successfully. 然后尝试使其成功运行。 In a related question the answer was to try no quotes around column names or to escape them with back ticks. 在一个相关的问题中 ,答案是尝试在列名周围不要使用引号,或使用反斜线将其引起来。

Here's how I ended up to meet the desired. 这就是我最终达到期望的方式。

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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM