Selecteer .... in error mysql

Ik heb deze opgeslagen procedure:

delimiter/
drop procedure if exists registration/create procedure registration(email varchar(50), pass varchar(50), first_name varchar(30), last varchar(30), address varchar(100), city varchar(30), state_id  int, zip varchar(20), phone varchar(15), alt_phone varchar(15), outlet varchar(100), url varchar(255), bio text, out response int, out photo_location varchar(40), image_type varchar(10), out emailer varchar(20), out max_row int) 
start_:begin 
 start transaction; 
 insert into registration_application values(null, email, PASSWORD(pass), first_name, last, address, city, state_id, zip, phone, alt_phone, outlet, url, bio); 
 set emailer=email; 
 select id into max_row from registration_application where email=email order by id;  
 commit; 
 set response= 1; 
end start_; 

De ID is een primaire sleutel, die auto_incremented is, en het e-mailveld heeft een unieke index; dus het is onmogelijk voor 2 rijen om dezelfde e-mail te bevatten; echter, telkens wanneer ik die procedure aanroer, keren de 'select ... in' altijd meer dan 1 rij terug, ook al bestaat er alleen een rij met dat e-mailadres.  Ik begrijp dat ik het kan beperken tot het retourneren van slechts één rij met behulp van limiet 1 en 'het gebruik van volgorde op id desc'; mijn vragen zijn echter deze:

  • Is het probleem een ​​fout in mysql? Ik heb veel mensen online gezien met een soortgelijk probleem.
  • Omdat ik geen idee heb van de positie van de id die ik zoek (aangezien de geselecteerde..in duidelijk meer dan één rij retourneerde), is er dan een manier om ervoor te zorgen dat de juiste id altijd wordt geretourneerd? Bedankt.
0
Je hebt waar email = email wat bijna altijd waar is. Geen wonder dat u veel (dus ALLES) rijen selecteert.
toegevoegd de auteur ypercubeᵀᴹ, de bron
Ik vermoed dat het probleem komt van het gebruik van dezelfde naam ( email ) voor een tabelkolom en een procedureparameter.
toegevoegd de auteur ypercubeᵀᴹ, de bron

2 antwoord

De LAST_INSERT_ID() -functie is de juiste manier om de laatste automatische incrementwaarde te krijgen.

1
toegevoegd
@ user705339: Maar dat is dezelfde e-mail die u zojuist hebt ingevoegd, toch?
toegevoegd de auteur Joe Stefanelli, de bron
Terwijl u technisch correct bent, werkt uw antwoord in dit geval niet omdat de code niet wordt ingesteld, altijd de laatste ingevoegde id selecteren; het is ingesteld om een ​​ID te selecteren op basis van de opgegeven e-mailparameter. Bedankt voor het antwoord, niettemin.
toegevoegd de auteur Kneel-Before-ZOD, de bron
Ja, maar de volgende keer is de e-mail die ik nodig heb misschien niet dezelfde als die ik zojuist heb ingevoegd. Die code was slechts een voorbeeld van hoe de procedures zullen worden gebouwd; dat is waarom het verkrijgen van de laatste insert id niet altijd de juiste manier voor mij is
toegevoegd de auteur Kneel-Before-ZOD, de bron

@ user705339 Zoals u hierboven vermeldde, kan de LAST_INSERT_ID() in bepaalde omstandigheden de gewenste id niet retourneren, bijvoorbeeld als u probeert een dubbele e-mail in te voegen, retourneert de instructie insert retourneren en is de waarde LAST_INSERT_ID() ongedefinieerd.

Uw probleem is een onduidelijke verwijzing naar e-mail, waarbij email = email altijd waar is en alle rijen in tabel registration_application wordt geretourneerd. En niet de verwachte enkele rij.

Wat u zou kunnen doen, aangezien u emailer = email inschakelt, is:

select id into max_row from registration_application where email=emailer order by id;
1
toegevoegd