MariaDB与MySQL:列定义默认表达式报错问题求助
问题:MariaDB 10.1.48 创建带函数默认值的表时报错
我在MySQL中创建了如下表,用于生成物化视图时存储并计算时间差:
CREATE TABLE `creationtime` ( `view` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci', `start` DATETIME NULL DEFAULT NULL, `stop` DATETIME NULL DEFAULT NULL, `diff` TIME NOT NULL DEFAULT timediff(`stop`,`start`) ) COMMENT='running time' COLLATE='utf8mb4_general_ci' ENGINE=InnoDB;
该语句可正常运行,打开表时会自动计算时间差。但在Debian Linux 9系统的MariaDB 10.1.48服务器上执行相同SQL时,出现如下错误:
/* SQL-Error (1064): 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 'timediff(stop,start) ) COMMENT='running time'
COLLATE='utf8mb4_general_ci' at line 5 */
错误原因及解决方法
- 错误根源:MariaDB 10.1版本不支持列默认值使用函数表达式,你用
timediff(stop, start)作为diff列的默认值,这在该版本中属于语法不支持的情况。MySQL较新版本支持这种写法,但MariaDB 10.1尚未实现该特性。 - 解决办法:
- 移除
diff列的默认值定义,改用触发器自动计算时间差:
创建插入和更新触发器,当操作start或stop列时自动填充diff值:-- 插入触发器 DELIMITER // CREATE TRIGGER trg_creationtime_insert BEFORE INSERT ON creationtime FOR EACH ROW BEGIN SET NEW.diff = TIMEDIFF(NEW.stop, NEW.start); END // DELIMITER ; -- 更新触发器 DELIMITER // CREATE TRIGGER trg_creationtime_update BEFORE UPDATE ON creationtime FOR EACH ROW BEGIN SET NEW.diff = TIMEDIFF(NEW.stop, NEW.start); END // DELIMITER ; - 若无法使用触发器,可在插入/更新数据时手动计算
diff值;或者升级MariaDB到10.2及以上版本(MariaDB 10.2开始支持列默认值使用函数表达式)。
- 移除
内容的提问来源于stack exchange,提问作者Juergen Schulze
相关产品推荐
相关产品推荐

