Je suis complètement nouveau à MySQL, et je me suis cogné avec quelques erreurs, mais toujours je trouve des solutions, sauf pour celui-ci je ne comprends pas comment le contourner . La procédure MySQL suivante me renvoie une valeur si la variable "ue" est 1 ou 0 (un tas de validation existe). La partie de validation (SET ue = EXISTS ...) fonctionne sans le reste du code, comme il se doit, le problème n'est pas là. Mais quand j'exécute la commande INSERT INTO SELECT, ça ne marche pas, ça renvoie toujours 0 comme réponse, quand ça devrait être 1. Ces deux lignes se mettent en confrontation.La procédure MySQL renvoyant une valeur erronée (INSERT SELECT en confrontation)
INSERT INTO meetup_participation SELECT id_utilisateur, event_id FROM DUAL WHERE ue = 1;
SELECT ue AS réponse;
La procédure devrait ajouter « ID utilisateur » et « ID d'événement » dans meetup_participation, puis mettre à jour la ligne à des « utilisateurs » correspondant à l'utilisateur que « ID utilisateur » pour incrémenter les «événements ont participé. Et il UPDATE également pour incrémenter la participation à l'événement avec cet 'identifiant d'événement'. J'utilise SET ue pour valider des choses comme, si l'utilisateur existe, si l'événement existe, si la date de l'événement est toujours valide et si l'utilisateur ne figure pas déjà dans ce tableau. Donc je passe cette valeur en tant que booléen à INSERT INTO meetup_participation [...] WHERE ue = 1. Après cela, je fais SELECT ue pour informer la validation retournée true et la procédure exécutée sans problèmes.
Voici la procédure complète.
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
Merci d'avance.
Il est difficile de comprendre à partir du segment de code quels champs proviennent des tables de base de données et quels sont les paramètres transmis à la procédure.Cela aiderait si vous pouviez fournir l'instruction create procedure avec les déclarations de variables et alias les noms de colonnes provenant de la base de données. Si la procédure n'est pas trop longue, éditez la question pour inclure la procédure complète. Aussi, je ne sais pas ce que ces deux lignes deviennent en face des moyens, pouvez-vous trouver une autre façon de décrire ce que vous voulez dire? –
@ P.Salmon J'ai édité le code pour une meilleure compréhension, en face je veux dire, sans 'INSERT INTO SELECT', il retourne la bonne valeur qu'il devrait ... Confront pourrait ne pas être la bonne façon de dire en anglais. –
Votre procédure fonctionne - avec les exceptions possibles de SET events_participated = events_payicipated + 1 et SET participants = participants + 1 qui doivent être qualifiés pour répondre à une valeur de départ de null - SET events_participated = ifnull (events_payicipated, 0) + 1 et SET participants = ifnull (participants, 0) + 1. –