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

Mar*_*ark 4 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;
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

Sco*_*uns 11

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

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

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


Kib*_*bee 7

我的猜测是因为MySQL对字段名称和代码不区分大小写

Grader = grader
Run Code Online (Sandbox Code Playgroud)

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