2017-02-15 6 views
1

Я совершенно не знаком с 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 

Заранее спасибо.

+0

Трудно понять из сегмента кода, какие поля поступают из таблиц базы данных и какие параметры переданы процедуре.Это помогло бы, если бы вы могли предоставить инструкцию create procedure объявлениям переменных и псевдоним имен столбцов, исходящих из db. Если процедура не слишком длинная, отредактируйте вопрос, чтобы включить полную процедуру. Кроме того, я не знаю, что означает эти две линии в противостоянии, можете ли вы найти другой способ описать, что вы имеете в виду? –

+0

@ P.Salmon Я отредактировал код для лучшего понимания, в противостоянии, я имею в виду, без «INSERT INTO SELECT», он возвращает правильное значение, которое он должен ... Конфликт может быть неправильным способом говорить по-английски. –

+0

Ваша процедура работает - за исключением исключений из событий SET_participated = events_participated + 1 и участников SET = участников + 1, которые должны быть квалифицированы для удовлетворения начального значения null - SET events_participated = ifnull (events_participated, 0) + 1 и Участники SET = ifnull (участники, 0) + 1. –

ответ

0

Инструкция INSERT выполняется отдельно от оператора SET ue = .... Я не уверен, чего вы пытаетесь выполнить, но код не имеет смысла.

Если вы хотите добавить записи в meetup_participation на основе тестов EXISTS, применяемых к каждой записи в таблице пользователей, вам необходимо применить тесты к каждой записи в инструкции SELECT как часть INSERT.

В коде, как показано, также имеются многочисленные проблемы с синтаксисом/грамматикой.

Если вы можете предоставить объяснение того, что вы пытаетесь выполнить с помощью этой процедуры, это может позволить кому-то предложить правильный способ кодирования процедуры.

+0

Извините, я не знаю, почему это не имеет смысла ... Я отредактировал вопрос, может быть, это лучше ... Код делает (вставлять, обновлять ...) работу, за исключением возврата выбранного значение, а код выбора работает без команды INSERT. Каковы проблемы с грамматикой/синтаксисом? PMA не предупреждает меня о каких-либо ... –

+0

Каждое из утверждений стоит на своем собственном. Если после набора, ue = 1, он будет равен 1 для всех записей в выбранной части вставки. IOW, он будет вставлять все записи из двойного в 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 

Примечание Я не утверждаю, что это решение целесообразно на ваш сайт, вам нужно сделать исследования и выяснить, что лучше для вас.

Смежные вопросы