2013-03-05 3 views
0

У меня возникла проблема с оператором sql в моем проекте. КодSQL Statement включает IF EXIST

IF EXISTS (SELECT * FROM person_drug WHERE drug_id=3 AND person_id=1) 
BEGIN 
    UPDATE person_drug SET amount=3 WHERE drug_id=3 AND person_id=1 
END 
ELSE 
BEGIN 
    INSERT INTO person_drug VALUES (1,3,3) 
END 

Когда я запускаю его я получил:

1064 - У вас ошибка в вашей ошибки синтаксиса SQL.

Но когда я запустил заявление UPDATE,SELECT,INSERT выше, я не получил никаких ошибок. В чем может быть проблема?

Благодаря

+1

Выполняется ли это внутри хранимой процедуры или функции? Конструкции управления потоком 'IF/ELSE' не могут выполняться вне этого контекста в MySQL. –

+0

Удалите слова 'BEGIN' и' END' * внутри * блоки 'IF' и' ELSE' – Barranka

ответ

0
BEGIN 
     IF EXISTS (SELECT * FROM person_drug WHERE drug_id=3 AND person_id=1) 
     UPDATE person_drug SET amount=3 WHERE drug_id=3 AND person_id=1 
    ELSE 
     INSERT INTO person_drug VALUES (1,3,3) 
    END IF; 
1

операторов управления потоком MySQL, (IF/ELSE/WHILE) могут быть использованы только в контексте хранимой процедуры или функции. Они не работают в интерактивных запросах.

Лучшее решение - использовать правильные ограничения индексирования и уникальности.

Если первичный ключ или уникальный индекс, определенный по (drug_id, person_id), то вы можете use ON DUPLICATE KEY UPDATE и выполнять все эти действия в одном заявлении:

/* key ensures uniqueness for drug_id, person_id */ 
ALTER TABLE person_drug ADD UNIQUE KEY (drug_id, person_id); 

/* Then it's possible to use INSERT .. ON DUPLICATE KEY UPDATE */ 
INSERT INTO person_drug (drug_id, person_id, amount) 
    VALUES (3, 1, 3) 
    ON DUPLICATE KEY UPDATE amount = VALUES(amount) 
0

если ур делает хранимая процедура означает, что и может сделать это так :

SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO

CREATE PROCEDURE лицо

КАК НАЧАТЬ

SET NOCOUNT ON; 



IF EXISTS 
(SELECT * FROM person_drug WHERE drug_id=3 AND person_id=1) 

НАЧАТЬ количество UPDATE person_drug SET = 3, где drug_id = 3 и person_id = 1 КОНЕЦ ИНАЧЕ НАЧАТЬ INSERT INTO person_drug ЗНАЧЕНИЯ (1,3,3)

END конец GO