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部分都很有趣。这很有效,谢谢!我想加上反勾应该足够清楚了,我想不是=)是的,就是这样(就像洋基也建议的那样)。我原以为倒勾就足以区分变量和实际列。谢天谢地,这是一个有趣的问题:在程序的任何其他点上,都没有问题。参数和变量没有固定的“保留”字集,只有在使用包含冲突列名的表时才会出现问题。