mysql如果存在

时间:2011-04-30 06:52:53

标签: mysql sql

我一直在盯着这一段时间。也许一些新鲜的眼睛能够指出我做错了什么..这是我的疑问:

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

我收到以下错误:

  

您的SQL语法有错误;   检查对应的手册   您的MySQL服务器版本   正确的语法在'IF附近使用(EXISTS   (SELECT * FROM admin_rule_module   WHERE rule_set_id ='13'和'enti'在   第1行

4 个答案:

答案 0 :(得分:4)

试试这个......

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

假设您至少有一个UNIQUE KEY键(rule_set_id,entity_id)。如果你想用条件和多个语句来做,你必须把它放在一个程序或一个功能。

答案 1 :(得分:2)

在mysql中,只在存储的程序中使用BEGIN END,这些关键字对查询无效。 此外,查询的IF具有不同的语法。 看起来你想要做的是,因为你试图用相同的值更新行:

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

答案 2 :(得分: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');

如果您在条款中添加UPDATEEXISTS并不真正需要rule_set_id='13'子句,但我不想为您做出任何假设。

答案 3 :(得分:-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