2013-03-05 49 views
0

我有一個在我的項目的sql語句的問題。該代碼SQL語句包括是否存在

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這方面外被執行。 – 2013-03-05 19:30:28

+0

刪除'BEGIN'和'END'關鍵字* *裏面的'IF'和'ELSE'塊 – Barranka 2013-03-05 19:37:31

回答

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人

AS BEGIN

SET NOCOUNT ON; 



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

BEGIN UPDATE SET person_drug量= 3 WHERE drug_id = 3,爲person_id = 1 END ELSE BEGIN INSERT INTO person_drug VALUES(1,3,3)

END 結束 GO