0

db テーブル内の特定のレコードの存在を確認したい。存在する場合は更新し、存在しない場合は更新する 新しいレコードを追加したい

そのためにストアドプロシージャを使用しています。最初に更新ステートメントを作成し、それが発生して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 でサポートされていますか?

4

2 に答える 2

1

私は問題を解決しました、私は2つの問題を抱えていました

  1. ROW_COUNT()は、挿入、更新、または削除ステートメントで影響を受ける行の数を取得するために使用されます。
  2. ストアドプロシージャでの等しい比較は=ではありません==

正しいストアドプロシージャは次のとおりです。

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 ;
于 2012-04-23T09:11:14.530 に答える
0

代わりに INSERT IGNORE ステートメントを使用してください。あなたのテーブルには一意のキーとして(user_id、privile_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
于 2012-04-23T09:23:48.137 に答える