MariaDB 5.5中CREATE OR REPLACE创建存储过程/函数报错咨询
MariaDB 5.5 不支持
CREATE OR REPLACE 存储过程/函数的原因及解决方案 你遇到的问题核心在于MariaDB版本对语法支持的差异:
1. 版本支持边界
MariaDB 直到 10.1.3版本 才正式引入了 CREATE OR REPLACE 语法对存储过程(PROCEDURE)和函数(FUNCTION)的支持。在此之前,这个语法仅适用于视图(VIEW)、触发器(TRIGGER)等少数对象,并不覆盖存储过程和函数。
你使用的 10.1.23-MariaDB 刚好在支持该语法的版本范围内,所以执行php artisan migrate时没有问题;而 5.5.59-MariaDB 属于非常早期的稳定版本,完全没有实现这个语法特性,因此会直接抛出SQL语法错误。
2. MariaDB 5.5 下的替代方案
要在旧版本中实现“存在则替换,不存在则创建”的效果,需要手动拆分逻辑:
- 先检查目标存储过程/函数是否存在,存在则删除;
- 再执行常规的
CREATE语句。
以你的函数为例,修改后的SQL代码如下:
DROP FUNCTION IF EXISTS `some_name`; CREATE DEFINER=`root`@`%` FUNCTION `some_name`(_IN_FECHA_PROYECCION date) RETURNS double BEGIN -- 这里写你的函数逻辑 END
如果是在Laravel迁移中使用,可以直接将这两句放在DB::statement()中执行:
DB::statement('DROP FUNCTION IF EXISTS `some_name`;'); DB::statement('CREATE DEFINER=`root`@`%` FUNCTION `some_name`(_IN_FECHA_PROYECCION date) RETURNS double BEGIN ... END;');
注意事项
- 确保执行操作的数据库账号拥有
DROP ROUTINE和CREATE ROUTINE的权限; - 如果存储过程/函数依赖其他对象,删除前要确认不会引发关联问题。
内容的提问来源于stack exchange,提问作者pmiranda
相关产品推荐
相关产品推荐

