MySQL, если существует - PullRequest
       5

MySQL, если существует

3 голосов
/ 30 апреля 2011

Я уже давно смотрю на это.Может быть, некоторые свежие глаза смогут указать, что я делаю неправильно .. Вот мой запрос:

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 'AND `enti' в строке 1

Ответы [ 4 ]

4 голосов
/ 30 апреля 2011

Попробуйте это ...

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

Предполагая, что у вас есть УНИКАЛЬНЫЙ КЛЮЧ (по крайней мере, rule_set_id, entity_id). Если вы хотите сделать это с условными и множественными операторами, вы должны поместить это в ПРОЦЕДУРУ или ФУНКЦИЮ.

2 голосов
/ 30 апреля 2011

В mysql вы используете BEGIN END только в хранимых программах, эти ключевые слова недопустимы для запросов. Также IF для запросов имеет разный синтаксис. Похоже, что вы хотите сделать, так как вы пытаетесь обновить строку с тем же значением:

INSERT IGNORE INTO admin_rule_module( rule_set_id, entity_id, permission ) 
  VALUES( 13, 2, 'allow' );
0 голосов
/ 30 апреля 2011

Редактировать Я думаю, что самый быстрый способ сделать это с помощью двух последовательно выполняемых запросов, например:

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' к своим предложениям, но я не хочу делать никаких предположений для вас.

0 голосов
/ 30 апреля 2011

Если вам требуется хранимая процедура для достижения вышеизложенного, вы можете переписать ваш запрос следующим образом:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...