2012-04-23 50 views
0

里面我要检查特定记录是否存在等在db表,如果它的存在,update如果不是我要添加新的记录获取结果从update语句出现存储过程

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

我作出这样

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支持?

+0

我认为这里不需要php标签。 – 2012-04-23 08:43:02

+0

PHP标签在哪里? – palAlaa 2012-04-23 08:46:14

+1

我已经为您编辑了标签。 – Maerlyn 2012-04-23 08:51:00

回答

0

使用INSERT忽略语句。我假设你的表有(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 
0

我解决问题,我有2个prblems

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

正确的存储过程是

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 ; 
相关问题