【问题标题】:Flyway | MariaDb - Unable to execute conditional block飞路 | MariaDb - 无法执行条件块
【发布时间】:2018-01-09 12:08:23
【问题描述】:

我想在包含现有数据的表中添加一个非空列。我的工具集包括 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 语句,但错误仍然存​​在。请提出一些解决方法。如果还有其他方法可以实现目标,还请推荐。 谢谢!

【问题讨论】:

  • 你不能使用这样的 SQL 代码..IF NOT EXISTS(SELECT 1) END IF; 是无效的 SQL。
  • @RaymondNijland 有没有提到正确的方法?

标签: mysql mariadb flyway


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这就是我最终满足期望的方式。

    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;
    

    【讨论】:

      猜你喜欢
      • 2020-01-08
      • 2022-12-13
      • 1970-01-01
      • 2021-06-06
      • 2020-06-15
      • 2016-03-11
      • 2020-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多