Simple procédure pour insert une ligne ou update un champ
Bonjour,
je suis nouveau sous mysql et j'essaye de creer une pocedure assez simple.
Elle a ete acceptee mais le comportement est plutot bizarre.
Voici la table:
Code:
1 2 3 4 5 6 7 8 9 10 11
|
create table down(
user int not null,
month varchar(7) not null,
size int
);
alter table down add constraint cUser_fk
foreign key(user) references auth(id);
create unique index iDown_x1 on down(user);
create unique index iDown_x2 on down(user,month); |
Ma proc, add_user_size(in user_id int, in month varchar(7), in size int) doit:
- creer une entree si il n'y a pas deja un couple (user_id, month)
- ajouter la size si il y a deja une entree
Voici le code
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
DELIMITER $$
create procedure add_user_size(
in user_id int,
in month varchar(7),
in size int
)
begin
declare month_exist int;
declare c_size int;
select
count(*)
into
month_exist
from
down
where
user=user_id
and month=month;
if (month_exist > 0) then
select
size
into
c_size
from
down
where
user=user_id
and month=month;
set c_size = c_size + size;
update
down
set
size=c_size
where
user=user_id
and month=month;
else
insert into down (
user,
month,
size
) values (
user_id,
month,
size
);
end if;
end $$
DELIMITER ; |
Lorsque je fais un premier call:
Code:
call add_user_size(3, "2013.10", 200);
Une ligne est cree.
Par contre qu'en ensuite je la reutilise avec:
Code:
call add_user_size(3, "2013.10", 300);
La size passe a 600 au lieu de 500... oO
Si je continue, j'ai encore un comportement etrange.
- Quelqu'un peu m'expliquer ce qui ne va pas?
- Autre question, suis je oblige de passer par une premiere requete pour avoir le count(*) ou y a't'il un moyen de faire directement la requete pour avoir la size et ensuite tester si le select a eu des reponses?
- Derniere question: comment puis je passer le parametre size en inout afin de modifier cette variable (au lieu de c_size) et la retourner en output. Dois je faire un return size a la fin?
Merci d'avance.