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

MySQL存储过程删除所有行,而不是一行,mysql,stored-procedures,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` (`d

我是第一次尝试存储过程,但我不知道我做错了什么

以下是表格定义:

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//
但是,每当我调用
new\u answer
时,所有现有的行都会被删除,并且一个新的答案现在是表中唯一的一行。
希望简单,谢谢您的帮助。

重命名您的参数:

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

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


不管怎样,看起来您只需要一个
插入。。。关于重复键更新
查询。

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

其中
uid
=uid和
dtid
=dtid始终为真…@Konerak确实如此。我原以为反勾号会将它们标记为列名而不是过程参数。重复键上的
会起作用吗,即使
uid
dtid
都不是主键?那么在(uid,dtid)上添加一个唯一的键。太棒了,我给你一个教我新东西的答案。(我不知道你可以使用多列键)同样,ty@KonerakDefinitely读一下:关于compund索引,有一些重要的事情需要知道。实际上,整个7.3部分都很有趣。这很有效,谢谢!我想加上反勾应该足够清楚了,我想不是=)是的,就是这样(就像洋基也建议的那样)。我原以为倒勾就足以区分变量和实际列。谢天谢地,这是一个有趣的问题:在程序的任何其他点上,都没有问题。参数和变量没有固定的“保留”字集,只有在使用包含冲突列名的表时才会出现问题。