2011-04-30 50 views
3

我一直在盯着這一段時間了。也許一些新鮮的眼睛就能指出什麼林做錯了。這裏是我的查詢:mysql如果存在

IF (EXISTS (SELECT * FROM `admin_rule_module` WHERE `rule_set_id`='13' AND `entity_id`='2')) 
begin 
UPDATE `admin_rule_module` 
SET `permission`='allow' WHERE `entity_id`='2' 
end 
else 
begin 
INSERT INTO `admin_rule_module` (`rule_set_id`, `entity_id`, `permission`) 
VALUES ('13', '2', 'allow') 
end 

,我發現了以下錯誤:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF (EXISTS (SELECT * FROM admin_rule_module WHERE rule_set_id ='13' AND `enti' at line 1

回答

4

嘗試......

INSERT INTO admin_rule_module VALUES (13, 2, 'allow') 
ON DUPLICATE KEY UPDATE permission = 'allow', entity_id = 2; 

假設你至少有一個唯一的KEY鍵(rule_set_id,entity_id)。如果你想用一個條件語句和多個語句來完成它,你必須把它放在PROCEDURE或者FUNCTION中。

+0

此表中沒有唯一的鍵。事實上,我不能在這個表中有一個唯一的關鍵。 – 2011-04-30 16:33:07

+0

你幫我。謝謝。 – yukaizhao 2013-03-04 07:41:06

2

在mysql中,僅在存儲程序中使用BEGIN END,這些關鍵字對於查詢無效。 另外如果查詢具有不同的語法。 看來你想要做的是,因爲你要更新具有相同值的行:

INSERT IGNORE INTO admin_rule_module(rule_set_id, entity_id, permission) 
    VALUES(13, 2, 'allow'); 
-1

如果你需要一個存儲過程來實現上述那麼你可以重寫查詢是這樣的:

begin 
    declare count int default 0; 
    set count=(SELECT * FROM `admin_rule_module` WHERE `rule_set_id`='13' AND `entity_id`='2'); 

    if count>0 then 
     UPDATE `admin_rule_module` 
     SET `permission`='allow' WHERE `entity_id`='2' ; 

    else 
     INSERT INTO `admin_rule_module` (`rule_set_id`, `entity_id`, `permission`) 
      VALUES ('13', '2', 'allow') ; 

    end if ;  
end 
0

編輯我認爲這樣做最快捷的方式是有兩個串行執行的查詢,像這樣:

UPDATE `admin_rule_module` 
SET `permission`='allow' 
WHERE `entity_id`='2' 
AND EXISTS (SELECT * FROM `admin_rule_module` 
      WHERE `rule_set_id`='13' AND `entity_id`='2'); 
INSERT INTO `admin_rule_module` 
    (`rule_set_id`, `entity_id`, `permission`) VALUES ('13', '2', 'allow') 
WHERE NOT EXISTS (SELECT * FROM `admin_rule_module` 
        WHERE `rule_set_id`='13' AND `entity_id`='2'); 

如果您將rule_set_id='13'添加到您的子句中,但我不想爲您做出任何假設,則UPDATE並不真的需要EXISTS子句。