簡體   English   中英

查詢總是返回1064語法錯誤

[英]Query always returns 1064 syntax error

我使用'MariaDB 5.5 x64' and Client HeidiSQL
服務器環境是Windows Server2012數據中心。
和數據庫use_progress在后面

int id //自動遞增主鍵
int owner //所有者用戶的唯一ID
varchar [20]名稱//鍵
int value //值

它存儲在線游戲用戶的狀態鍵值類型

例如

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  

但是發生相同的錯誤(消息相同)
我不知道為什么會這樣。

您不能在簡單查詢中僅在存儲過程或函數中使用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM