mysql如果存在

mysql如果存在,mysql,sql,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 `ad

我已经盯着这个看了一段时间了。也许一些新的眼睛能指出我做错了什么。。我的问题是:

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服务器版本 使用near'IF(存在)的正确语法 (从管理规则模块中选择* 其中
规则设置\u id
='13'和'enti'位于 第1行

试试这个

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

假设您至少有一个唯一的密钥(rule\u set\u id,entity\u id)。如果您想使用条件语句和多个语句,则必须将其放入过程或函数中。

在mysql中,您仅在存储程序中使用BEGIN-END,这些关键字对于查询无效。 另外,如果for查询具有不同的语法。 似乎您要做的是,因为您正在尝试使用相同的值更新行:

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

如果需要一个存储过程来实现上述功能,则可以如下所示重写查询:

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

编辑我认为最快的方法是使用两个连续执行的查询,如下所示:

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');

如果将
规则集\u id='13'
添加到子句中,则
更新
实际上不需要
存在
子句,但我不想为您做任何假设。

此表中没有唯一键。事实上,此表中没有唯一键。