|
 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
// | |
|
|
|
|
|
|
|
для: 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`. | |
|
|
|
|
|
|
|
для: 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
//
|
| |
|
|
|