Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите с процедурой
 
 автор: Usta   (18.07.2010 в 00:48)   письмо автору
1.4 Кб
 
 

Пишу процедуру, но она почему-то не фурычит.
Должно быть следующее:
Мы заносим в таблицу(zakaz) заказ диска. Потом нужно проверить в таблице(wear) если диск с таким id_dvd уже есть, то прибавляем +1 к count, если нет то добавляем строку. Не работает WHERE, толко не знаю почему. Он мне всегда на ELSE перебрасывает и прибавляет ко всем полям по +1. Спасибо.
Процедура для подсчета износа дисков
DELIMITER //
CREATE procedure proc(in id_client int(11),in id_dvd int(11) )
BEGIN
DECLARE coun INT DEFAULT 0;
INSERT INTO `zakaz` VALUES(NULL,id_client,id_dvd,'',NOW());
SELECT COUNT(*) into coun FROM `wear` WHERE `id_dvd` = id_dvd;
IF coun = 0 THEN
INSERT INTO `wear` VALUES(NULL,id_dvd,1);
ELSE
UPDATE `wear` SET `count` = `count` + 1 WHERE `id_dvd` = id_dvd;
end IF;
END
//

  Ответить  
 
 автор: sms-send   (18.07.2010 в 06:12)   письмо автору
 
   для: Usta   (18.07.2010 в 00:48)
 

> Не работает WHERE, толко не знаю почему.
Работает, только возможно не так, как вы ожидаете. У вас в процедуре входной параметр id_dvd имеет такой же идентификатор, как и поле таблицы.
Для MySQL нет никакой разницы возьмёте вы идентификатор в обратные кавычки или нет, в любом случае он будет ссылаться на одноимённую локальную переменную, поэтому выражение `id_dvd` = id_dvd преобразуется в константу 1 (число всегда равно самому себе). Можно явно указать таблицу, содержащую поле:
SELECT COUNT(*) into coun FROM `wear` WHERE `wear`.`id_dvd` = id_dvd

А лучше давать идентификаторам локальных переменных префикс, например "_", вне зависимости от того есть ли одноимённые поля или нет, просто визуально удобней различать.
Scope and Resolution of Local Variables

Дальше не по теме.
Для таблицы `wear` поле `id_dvd`, судя по костылям в процедуре, должно быть естественным первичным ключом, т.е. надобности в поле `id_wear` нет. Так вот когда оно таковым (первичным ключом) станет, можно будет использовать такой запрос в процедуре:
INSERT INTO `wear`(`id_dvd`, `count`) VALUES(id_dvd, 1) ON DUPLICATE KEY UPDATE `count` = `count` + 1
INSERT ... ON DUPLICATE KEY UPDATE Syntax

Ещё не совсем понятно наличие уникального индекса на поле `id_dvd` в таблице `zakaz` одновременно с наличием поля-счётчика для каждого диска в таблице `wear`.

  Ответить  
 
 автор: Usta   (18.07.2010 в 14:49)   письмо автору
 
   для: sms-send   (18.07.2010 в 06:12)
 

>Можно явно указать таблицу, содержащую поле:
>SELECT COUNT(*) into coun FROM `wear` WHERE `wear`.`id_dvd` = id_dvd
Да, в такой связке заработало
>Для таблицы `wear` поле `id_dvd`, судя по костылям в процедуре, должно быть естественным первичным ключом, т.е. надобности в поле `id_wear` нет.
Действительно ненужен здесь id_wear, если id_dvd уникален. Убрал поле id_wear и id_dvd сделал уникальным.
Переписал вот так, и все заработало. Спасибо.

DELIMITER //
CREATE procedure proc(in id_client int(11),in id_dvd int(11) )
BEGIN
INSERT INTO `zakaz` VALUES(NULL,id_client,id_dvd,'',NOW());
INSERT INTO `wear`(`id_dvd`, `count`) VALUES(id_dvd, 1) ON DUPLICATE KEY UPDATE `count` = `count` + 1;
END 
//

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования