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'
添加到子句中,则更新
实际上不需要存在
子句,但我不想为您做任何假设。此表中没有唯一键。事实上,此表中没有唯一键。