Я совершенно не знаком с MySQL и натыкаюсь на некоторые ошибки, но всегда нахожу решения, за исключением этого, я не могу понять, как обойти его ,MySQL процедура возвращает неправильное значение (INSERT SELECT confronting)
Следующая процедура MySQL возвращает мне значение, если переменная «ue» равна 1 или 0 (валидация связки существует). Часть проверки (SET ue = EXISTS ...) работает без остальной части кода, как и следовало ожидать, проблемы там нет. Но когда я выполняю команду INSERT INTO SELECT, она не работает, она всегда возвращает 0 в качестве ответа, когда это должно быть 1. Эти две линии находятся в конфронтации друг с другом.
INSERT INTO meetup_participation SELECT user_id, event_id FROM DUAL WHERE ue = 1;
SELECT ue AS response;
Процедура должна добавить «идентификатор пользователя» и «идентификатор события» в meetup_participation, а затем обновить строку на «пользователей», соответствующий пользователю с этим «идентификатор пользователя» прирастить «участие событий» в. И он также ОБНОВЛЯЕТ увеличить участие в событии с этим «идентификатором события».
Я использую 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_participated = events_participated + 1 и участников SET = участников + 1, которые должны быть квалифицированы для удовлетворения начального значения null - SET events_participated = ifnull (events_participated, 0) + 1 и Участники SET = ifnull (участники, 0) + 1. –