2011-04-30 47 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子句。