如何改写MariaDB 10.4.27生成列语句适配10.1.38版本
适配MariaDB 10.1.38的改写方案
MariaDB 10.1.38和10.4.27在生成列语法及特性支持上存在两处关键差异,需要针对性修改:
1. 移除IF NOT EXISTS语法
MariaDB从10.2.1版本才开始支持ADD COLUMN IF NOT EXISTS,10.1.38不包含该特性,执行会直接报错。需要先判断列是否存在,再决定是否执行添加操作:
方式一:手动检查后执行
先查询列是否存在:
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'table' AND COLUMN_NAME = 'col2_int';
如果返回结果为0,再执行添加列语句。
方式二:用存储过程自动判断
创建存储过程封装逻辑(适合批量/自动化场景):
DELIMITER // CREATE PROCEDURE AddCol2IntIfNotExists() BEGIN DECLARE col_count INT; SELECT COUNT(*) INTO col_count FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'table' AND COLUMN_NAME = 'col2_int'; IF col_count = 0 THEN ALTER TABLE `table` ADD COLUMN col2_int INT GENERATED ALWAYS AS (CASE WHEN col1_date IS NULL THEN 0 ELSE UNIX_TIMESTAMP(col1_date) END) STORED; END IF; END // DELIMITER ; -- 调用存储过程 CALL AddCol2IntIfNotExists();
2. 替换IF函数为CASE WHEN(兼容早期版本)
部分早期MariaDB 10.1版本对生成列中IF函数的支持存在兼容性问题,替换为标准SQL的CASE WHEN语法更稳妥:
原表达式:
IF(col1_date IS NULL,0,UNIX_TIMESTAMP(col1_date))
替换为:
CASE WHEN col1_date IS NULL THEN 0 ELSE UNIX_TIMESTAMP(col1_date) END
最终可用的ALTER语句(无IF NOT EXISTS)
如果已经确认列不存在,直接执行:
ALTER TABLE `table` ADD COLUMN col2_int INT GENERATED ALWAYS AS (CASE WHEN col1_date IS NULL THEN 0 ELSE UNIX_TIMESTAMP(col1_date) END) STORED;
内容的提问来源于stack exchange,提问作者user20250937
相关产品推荐
相关产品推荐

