Хранимая процедура MySQL УДАЛЯЕТ все строки вместо одной - PullRequest
2 голосов
/ 19 июля 2011

Я пробую хранимые процедуры в первый раз и не могу понять, что делаю неправильно.

Вот определение таблицы:

CREATE TABLE `answers` (
  `anid` int(11) unsigned NOT NULL auto_increment,
  `uid` int(11) NOT NULL,
  `dtid` int(11) NOT NULL,
  `answer` text NOT NULL,
  PRIMARY KEY  (`anid`),
  KEY `uid` (`uid`),
  KEY `dtid` (`dtid`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

anid - это первичный ключ, uid - это идентификатор пользователя, dtid - это идентификатор базы данных, а answer - предоставленный ответ.Всякий раз, когда я получаю новый ответ для данного набора данных (вопроса) и идентификатора пользователя, я хочу сначала удалить любой старый ответ на этот же вопрос этого же пользователя, а затем вставить новый.

Вот процедураобъявление:

DELIMITER //
CREATE PROCEDURE new_answer(uid INT(11),dtid INT(11),answer TEXT)
BEGIN
    DELETE FROM `answers` WHERE `uid` = uid AND `dtid` = dtid;
    INSERT INTO `answers` SET `uid` = uid, `dtid` = dtid, `answer` = answer;
END//

Однако всякий раз, когда я CALL new_answer, удаляются ВСЕ существующие строки, и этот новый ответ теперь является единственной строкой в ​​таблице.Надеюсь, это что-то простое, спасибо за вашу помощь.

Ответы [ 3 ]

4 голосов
/ 19 июля 2011

Переименуйте ваши параметры:

DELIMITER //
CREATE PROCEDURE new_answer(p_uid INT(11),p_dtid INT(11),p_answer TEXT)
BEGIN
    DELETE FROM `answers` WHERE `uid` = p_uid AND `dtid` = p_dtid;
    INSERT INTO `answers` SET `uid` = p_uid, `dtid` = p_dtid, `answer` = p_answer;
END//
2 голосов
/ 19 июля 2011

Возможно, вам следует попробовать именовать аргументы процедуры, отличные от столбцов таблицы.

В любом случае, похоже, все, что вам нужно, - это один INSERT ... ON DUPLICATE KEY UPDATE запрос.

1 голос
/ 19 июля 2011

Я не знаком с хранимыми процедурами, но как насчет переименования параметров вашей функции в x и y, а не в имена столбцов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...