Reputation: 1615
I've been staring at this for a while now. Maybe some fresh eyes will be able to point out what Im doing wrong.. Here is my query:
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
I'm getting the following error:
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
WHERErule_set_id
='13' AND `enti' at line 1
Upvotes: 3
Views: 7797
Reputation: 107
If you need a stored procedure to achieve the above then you can rewrite your query like this:
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
Upvotes: -1
Reputation: 3573
Edit I think the quickest way to do this is with two serially executed queries like so:
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');
The UPDATE
doesn't really need the EXISTS
clause if you add rule_set_id='13'
to your clauses but I don't want to make any assumptions for you.
Upvotes: 0
Reputation: 12356
In mysql you use BEGIN END only in stored programs, these keywords are invalid for queries. Also IF for queries has different syntax. It seems what you want to do is, since you are trying to update the row with the same value:
INSERT IGNORE INTO admin_rule_module( rule_set_id, entity_id, permission )
VALUES( 13, 2, 'allow' );
Upvotes: 2
Reputation: 6798
Try this...
INSERT INTO admin_rule_module VALUES (13, 2, 'allow')
ON DUPLICATE KEY UPDATE permission = 'allow', entity_id = 2;
Assuming you've a UNIQUE KEY key (rule_set_id, entity_id), at least. If you want to do it with a conditional and multiple statements, you have to put it in a PROCEDURE or a FUNCTION.
Upvotes: 4