从存储过程内的update语句获取结果

时间:2012-04-23 08:37:55

标签: mysql stored-procedures rows-affected

我想检查db表中特定记录的存在,如果它存在则更新,如果不是我想添加新记录

我正在使用存储过程这样做,首先我进行更新stetement并想检查它是否发生并返回0然后没有受update语句影响的记录,这意味着记录不存在。

我这样做

DELIMITER //
CREATE PROCEDURE revokePrivilegeFromUsers(IN userId int(11),  IN privilegeId int(11), IN deletedBy int(11))

BEGIN
  DECLARE isExist int;

  isExist = update `user_privileges` set `mode` ='d' ,`updated_by` = deletedBy, `date_time_assigned` =  CURRENT_TIMESTAMP()  where `user_id`= userId and `privilege_id`=privilegeId;

 IF  isExist  == 0 THEN
      insert into `user_privileges`(`user_id`,`privilege_id`,`mode`,`date_time_assigned`,`updated_by`)values (userId ,privilegeId ,'d',CURRENT_TIMESTAMP(),deletedBy );

 END IF;


END //

DELIMITER ;

我发生此错误

#1064 - 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 '= update `user_privileges` set `mode` ='d' ,`updated_by` = deletedBy, `date_time' at line 6

我的工作方式是否受mysql支持?

2 个答案:

答案 0 :(得分:1)

我解决了这个问题,我有2个问题

  1. ROW_COUNT()用于获取插入,更新或删除语句中受影响的行数。
  2. 存储过程中的等于比较= = = =
  3. 正确的存储过程是

    DELIMITER //
    CREATE PROCEDURE revokePrivilegeFromUsers(IN userId int(11),  IN privilegeId int(11), IN deletedBy int(11))
    
    BEGIN
    DECLARE count int default -1;
    
    update `user_privileges` set `mode` ='d' ,`updated_by` = deletedBy, `date_time_assigned` =  CURRENT_TIMESTAMP()  where `user_id`= userId and `privilege_id`=privilegeId;
    SELECT ROW_COUNT() into count ;
    IF count  = 0 THEN
           insert into `user_privileges`(`user_id`,`privilege_id`,`mode`,`date_time_assigned`,`updated_by`)values (userId ,privilegeId ,'d',CURRENT_TIMESTAMP(),deletedBy );
    
    END IF;
    END //
    
    DELIMITER ;
    

答案 1 :(得分:0)

请改用INSERT IGNORE语句。我假设您的表具有(user_id,privilege_id)作为唯一键。

insert ignore into user_privileges (user_id,privilege_id,`mode,date_time_assigned,updated_by)
values (userId ,privilegeId ,'d',CURRENT_TIMESTAMP(),deletedBy )
on duplicate key update mode='d', date_time_assigned=now(),updated_by=deletedBy