我一直在盯着这一段时间。也许一些新鲜的眼睛能够指出我做错了什么..这是我的疑问:
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
WHERErule_set_id
='13'和'enti'在 第1行
答案 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');
如果您在条款中添加UPDATE
,EXISTS
并不真正需要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