mariadb 在'declare exists_check int'附近使用错误语法

kadbb459  于 2023-04-30  发布在  其他
关注(0)|答案(2)|浏览(91)

我正在编写一个脚本来更新数据库模式,脚本如下:

delimiter //

begin 
    set @check_exists = 0;

    select count(*)
    into @check_exists
    from information_schema.columns
    where table_schema = 'my_app'
    and table_name = 'users'
    and column_name = 'points';
        
    if (@check_exists = 0) then
        alter table my_app.users
        add points int not null default 0
    end if;
end //

delimiter

当我运行它时,我得到下面的错误:

Reason:
 SQL Error [1064] [42000]: (conn=34) 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 'set @check_exists = 0;

我已经检查了下面两个帖子的答案,但没有一个能解决我的问题。

  • this问题的解决方案是更改分隔符,并更改为
  • this问题的解决方案是删除DECLARE关键字,只声明MariaDB手册中的变量hereset @var int;
8e2ybdfx

8e2ybdfx1#

我认为在开始语句之前需要有一个CREATE PROCEDURE。所以:

delimiter //

CREATE PROCEDURE UPDATE_SCHEMA()
begin 
    set @check_exists = 0;
    (...your other script here...)
end//

delimiter ;

call UPDATE_SCHEMA();

补充说明:if语句中的check_exists需要一个@

vjhs03f7

vjhs03f72#

根据开始END文档here,语法为:
开始[NOT ATOMIC] [statement_list] END [end_label]

以下是我不知道的

当在存储过程之外使用时,需要NOT ATOMIC。在存储过程或匿名块中,开始单独启动一个新的匿名块。
由于我没有在存储过程中使用开始END,因此必须在BEGIN关键字之后添加NOT ATOMIC
代码应该是这样的:

delimiter //

begin not atomic
    set @check_exists = 0;

-- rest of the code here...

相关问题