【问题标题】:Query always returns 1064 syntax error查询总是返回 1064 语法错误
【发布时间】:2014-09-09 06:50:18
【问题描述】:

我使用'MariaDB 5.5 x64' and Client HeidiSQL
服务器环境为Windows Server2012 Datacenter。
并且数据库use_progress 后面有一行

int id //自增主键
int owner //owner 用户唯一id
varchar[20] 名称 //key
int 值 //值

它存储在线游戏用户的状态键值类型

例如

id  owner name           value
856 656   stage0cleared  0
857 656   have_gold      10214  
858 657   inventory      22    

下一个查询的工作测试很好

select count(*) from use_progress where owner = 656 and name = "inventory";

INSERT INTO use_progress (use_progress.owner, use_progress.name, use_progress.value) VALUES (656, 'inventory', 7);

UPDATE use_progress SET use_progress.value = 7 WHERE use_progress.`owner` = 656 AND use_progress.`name` = 'inventory';

但是下一个查询是错误1064(语法错误)

BEGIN  
    IF ((select count(*) from use_progress where owner = 656 and name = "inventory") = 0 )   THEN  
        INSERT INTO use_progress (use_progress.owner, use_progress.name, use_progress.value) VALUES (656, 'inventory', 7);  
    ELSE  
        UPDATE use_progress SET use_progress.value = 7 WHERE use_progress.`owner` = 656 AND use_progress.`name` = 'inventory';  
    END IF;  
END  

错误紧随其后(总是那个错误):

/* 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 'IF ((select count(*) from use_progress where owner = 656 and name = "inventory")' at line 2 */

我尽我所能。是否使用 (),是否在每个列名中插入 dbname.tablename. 前缀。但在每种情况下,都会发生相同的错误。

我什至试过这个(第 2 行已更改):

BEGIN  
    IF (1>2)   THEN  
        INSERT INTO use_progress (use_progress.owner, use_progress.name, use_progress.value) VALUES (656, 'inventory', 7);  
    ELSE  
        UPDATE use_progress SET use_progress.value = 7 WHERE use_progress.`owner` = 656 AND use_progress.`name` = 'inventory';  
    END IF;  
END  

但发生同样的错误(消息相同)
我不知道为什么会这样。

【问题讨论】:

  • 您是否更改了分隔符?您只能在存储的例程中使用 BEGIN ... END。

标签: mysql sql database mariadb


【解决方案1】:

您不能在简单查询中使用像IF() THEN ... 这样的控制结构,只能在存储过程或函数中使用。

在这种情况下,您将使用存储过程。试试这样:

DELIMITER $$
CREATE PROCEDURE my_proc_name(IN p_owner int, IN p_name varchar(50), IN p_value int)
BEGIN  
    IF NOT EXISTS (select 1 from use_progress where owner = p_owner and name = p_name) THEN  
        INSERT INTO use_progress (owner, name, `value`) VALUES (p_owner, p_name, p_value);  
    ELSE  
        UPDATE use_progress SET `value` = p_value WHERE `owner` = p_owner AND `name` = p_name;  
    END IF;  
END $$
DELIMITER ;

创建之后,你可以这样称呼它:

CALL my_proc_name(656, 'inventory', 7);

【讨论】:

  • 它有效。我不知道 程序 因为我是第一次来 DB。这个“先行概念”为我的数据库设计问题提供了许多解决方案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 2020-05-17
  • 2019-01-02
  • 2014-02-24
  • 2017-06-10
  • 2015-04-25
相关资源
最近更新 更多