2017-02-15 38 views
1

我對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 

在此先感謝。

+0

從代碼段很難理解哪些字段來自數據庫表,哪些字段是傳遞給過程的參數。如果你可以提供帶有變量聲明的create procedure語句和別名來自db的列名,這將會有所幫助。如果程序不太長,請編輯問題以包含完整的程序。另外我不知道這兩條線在對抗手段上的變化,你能找到另一種方式來描述你的意思嗎? –

+0

@P.Salmon爲了更好的理解,我編輯了代碼,我的意思是,沒有'INSERT INTO SELECT',它確實返回了它應該的正確值。面對可能不是用英語說的正確方法。 –

+0

您的程序確實有效 - SET events_participated = events_participated + 1和SET參與者=參與者+1的可能的例外情況需要合格以滿足初始值爲null - SET events_participated = ifnull(events_participated,0)+ 1和SET參與者= ifnull(參與者,0)+ 1. –

回答

0

INSERT語句與SET ue = ...語句分開執行。我不確定你想要完成什麼,但代碼沒有意義。

如果要根據應用於users表中每條記錄的EXISTS測試向meetup_participation添加記錄,則需要將測試應用於SELECT語句中的每條記錄,作爲INSERT的一部分。

代碼中還有很多語法/語法問題,如圖所示。

如果你可以提供你正在試圖用程序完成的解釋,那可能會讓某人提出正確的方法來編寫程序。

+0

對不起,我不知道它爲什麼沒有意義...我編輯了這個問題,也許它更好...代碼確實(插入,更新...)工作,除了返回所選值,並且選擇代碼在沒有INSERT命令的情況下工作。什麼是語法/語法問題? PMA不會提醒我任何... –

+0

每個陳述都是獨立的。如果在設置後,ue = 1,則插入的選擇部分中的所有記錄將等於1。 IOW,它會將所有記錄從dual中插入meetup_participation中。它不會從一個記錄變成另一個記錄。兩個選擇相同。您正在使用返回的值,而不是來自set語句的「公式」。 –

0

選擇ue不會告訴您程序是否完成沒有錯誤。你應該研究mysql事務和mysql錯誤處理。 http://www.mysqltutorial.org/mysql-error-handling-in-stored-procedures/是一個很好的起點。

你可能有這樣的事情

drop procedure if exists p; 
delimiter // 

CREATE DEFINER=`root`@`localhost` PROCEDURE `p`(
    IN `inue` int, 
    IN `user_id` BIGINT(64), 
    IN `event_id` INT 
) 
LANGUAGE SQL 
NOT DETERMINISTIC 
MODIFIES SQL DATA 
SQL SECURITY DEFINER 
COMMENT '' 
begin 

DECLARE ue INT; 
declare exit handler for sqlexception 
begin 
    rollback; 
    insert into errors (msg) select concat('error ' ,inue,',',user_id,',',event_id); 
end; 

set autocommit = 0; 
#set ue = inue; 
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 dt > NOW() AND meet_id = event_id) 
    AND EXISTS(SELECT 1 FROM meetup WHERE meet_id = event_id AND ifnull(participants,0) <= max_participants) 
    AND NOT EXISTS(SELECT 1 FROM meetup_participation WHERE fb_uid = user_id AND meet_id = event_id) 
    ; 
select ue; 

if ue = 1 then 

start transaction; 

INSERT INTO meetup_participation SELECT user_id, event_id,user_id, event_id; 
UPDATE users SET events_participated = ifnull(events_participated,0) + 1 WHERE fb_uid=user_id = user_id; 
UPDATE meetup SET participants = ifnull(participants,0) + 1 WHERE meet_id = event_id ; 

commit; 

end if; 

SELECT ue AS response; 

end // 

錯誤表看起來像這樣

CREATE TABLE `errors` (
    `msg` varchar(2000) DEFAULT NULL, 
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 

注意我並不認爲這是適合您的網站的解決方案最終,你需要做的研究並找出對你最好的方法。