2014-07-18 4 views
0

나는 'MariaDB 5.5 x64' and Client HeidiSQL을 사용합니다.
서버 환경은 Windows Server2012 Datacenter입니다. 행이쿼리는 항상 1064 구문 오류를 반환합니다.

INT 아이디 // 자동 증분 기본 키
INT 소유자 // 소유자의 사용자의 고유 ID
VARCHAR [20] 이름 // 키
int 값 따르고
그리고 데이터베이스 use_progress // 값은

은 키 - 값 형식

예를

01 온라인 게임 사용자의 상태를 저장 23,516,
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 (구문 오류) 오류가 folling됩니다

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 

그러나 같은 오류가 발생합니다 (메시지가 동일합니다) 이런 일이 왜
는 모르겠어요.

+0

당신이 구분 기호를 바꿨나요? 저장된 루틴에서만 BEGIN ... END를 사용할 수 있습니다. – VMai

답변

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); 
+0

이 작동합니다. 나는 DB에서 처음이기 때문에 * procedure *를 모른다. 이 '선행 개념'은 내 DB 설계 문제에 대한 많은 솔루션을 제공합니다. 고맙습니다. – user1101221

관련 문제