MySQL存储过程删除所有行而不是一行

时间:2011-07-18 20:36:11

标签: mysql stored-procedures

我第一次尝试存储过程,我无法弄清楚我做错了什么。

以下是表格定义:

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是用户ID,dtid是基准ID,answer是提供的答案。 每当我得到给定数据(问题)和用户ID的新答案时,我想首先删除同一用户对同一问题的任何旧答案,然后插入新答案。

这是程序声明:

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 个答案:

答案 0 :(得分:4)

重命名参数:

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//

答案 1 :(得分:2)

您应该尝试命名不同于表列的过程参数。

无论如何,看起来你需要的只是一个INSERT ... ON DUPLICATE KEY UPDATE查询。

答案 2 :(得分:1)

我不熟悉存储过程,但是将函数参数重命名为x和y而不是与列名相同呢?