存储过程中的MySql COUNT(*)不同

时间:2011-06-07 20:15:26

标签: mysql sql stored-procedures

我正在制作一个'评分'系统,我正在努力确保一个人无法通过使用存储过程提交两次评分,该存储过程将检查某人是否在允许新评分之前评分了某个特定项目等级要保存。奇怪的是,我传递的是用户ID和对象ID,但是当我的存储过程选择COUNT(*)时,我得到了错误的数字。

这是我的存储过程:

CREATE PROCEDURE `ADD_GRADE`(IN objectID int, IN grader int)
BEGIN
DECLARE gradeCount INT;

SELECT COUNT(*)
FROM GRADES
WHERE Obj_ID = objectID AND Grader = grader
INTO gradeCount;

IF gradeCount <= 0 THEN INSERT INTO Grades (Obj_ID, Grader) VALUES (objectID, grader);
END IF;

IF语句正在运行,但出于某种原因,我的gradeCount似乎忽略了Grader ID,只是根据Obj_ID进行检查。我添加了选择以确保我的参数保持正确的值并且它们是。如果我只复制选择并在其他地方手动执行,我会得到正确的数字。

虽然是MySql的新手,但我并不是SQL本身的新手。我只是疯了吗?或者我做错了什么?

由于

2 个答案:

答案 0 :(得分:11)

即使这段代码有效(我不知道为什么不这样做),也不是确保只输入一次的正确方法。

正确的方法是对objectID和grader列应用唯一约束。然后尝试插入行。如果行插入,则值是唯一的。如果您获得了唯一的违规行为,则表示已输入值。

如果您没有可用的唯一约束,则应锁定表以确保命令之间不会发生其他更新。

答案 1 :(得分:7)

我的猜测是因为MySQL对字段名称和代码

不区分大小写
Grader = grader

只是将列与自身进行比较,这始终是正确的。您可能需要重命名要传入的参数,以使其与现有列的名称不同。我通常所有的存储过程参数都以__(双下划线)进行,所以我不会遇到这样的情况。