我對MySQL完全陌生,並且遇到了一些錯誤,但總是找到解決方案,除了這一個我無法理解如何解決它。MySQL過程返回錯誤值(INSERT SELECT面臨)
如果變量「ue」是1或0(一堆存在驗證),下面的MySQL過程會返回一個值。驗證部分(SET ue = EXISTS ...)在沒有其他代碼的情況下工作,因爲它應該是,問題不在那裏。但是,當我執行命令INSERT INTO SELECT時,它不起作用,它總是返回0作爲響應,當它應該是1.這兩條線正在彼此對抗。
INSERT INTO meetup_participation SELECT USER_ID,event_id FROM DUAL WHERE ue = 1;
選擇你的AS響應;
該過程應該在'meetup_participation'中添加'user id'和'event id',然後用'user id'更新'user'對應的用戶行以增加'events joined'。並且它還通過這個'事件ID'來增加參與事件的次數。
我正在使用SET ue驗證事件,如果用戶存在,事件是否存在,事件日期是否仍然有效以及用戶是否已經在此表中。所以我將這個值作爲布爾值傳遞給INSERT INTO meetup_participation [...] WHERE ue = 1。之後,我做SELECT ue來通知驗證返回true,並且程序執行時沒有問題。
這是完整的程序。
CREATE DEFINER=`user`@`localhost` PROCEDURE `join_event`(IN `user_id` BIGINT(64), IN `event_id` INT) NOT DETERMINISTIC MODIFIES SQL DATA SQL SECURITY DEFINER
begin
DECLARE ue INT;
SET ue = EXISTS(SELECT 1 FROM users WHERE fb_uid=user_id) AND EXISTS(SELECT 1 FROM meetup WHERE meet_id=event_id) AND EXISTS(SELECT 1 FROM meetup WHERE date > NOW() AND meet_id = event_id) AND EXISTS(SELECT 1 FROM meetup WHERE meet_id = event_id AND participants <= max_participants) AND NOT EXISTS(SELECT 1 FROM meetup_participation WHERE fb_uid = user_id AND meet_id = event_id);
INSERT INTO meetup_participation SELECT user_id, event_id FROM DUAL WHERE ue=1;
UPDATE users SET events_participated = events_participated + 1 WHERE fb_uid=user_id AND ue=1;
UPDATE meetup SET participants = participants + 1 WHERE meet_id=event_id AND ue=1;
SELECT ue AS response;
end
在此先感謝。
從代碼段很難理解哪些字段來自數據庫表,哪些字段是傳遞給過程的參數。如果你可以提供帶有變量聲明的create procedure語句和別名來自db的列名,這將會有所幫助。如果程序不太長,請編輯問題以包含完整的程序。另外我不知道這兩條線在對抗手段上的變化,你能找到另一種方式來描述你的意思嗎? –
@P.Salmon爲了更好的理解,我編輯了代碼,我的意思是,沒有'INSERT INTO SELECT',它確實返回了它應該的正確值。面對可能不是用英語說的正確方法。 –
您的程序確實有效 - SET events_participated = events_participated + 1和SET參與者=參與者+1的可能的例外情況需要合格以滿足初始值爲null - SET events_participated = ifnull(events_participated,0)+ 1和SET參與者= ifnull(參與者,0)+ 1. –