我正在开发一个“评分”系统,并试图通过使用一个存储过程来确保一个人不能提交两次成绩,该存储过程将检查一个人是否已经对特定项目进行了评分,然后才允许新的要保存的等级。奇怪的是,我正在传递用户 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 似乎忽略了评分者 ID,只是根据 Obj_ID 进行检查。我已经添加了选择以确保我的参数保持在正确的值并且它们是。如果我只复制选择并在其他地方手动执行,我会得到正确的数字。
虽然我是 MySql 的新手,但我对 SQL 本身并不陌生。我要疯了吗?还是我做错了什么?
谢谢
最佳答案
即使此代码有效(我不知道为什么无效),它也不是确保某些内容仅输入一次的正确方法。
正确的方法是对 objectID 和 grader 列应用唯一约束。然后尝试插入行。如果行插入,则值是唯一的。如果您遇到独特的违规情况,则说明已经输入了值。
如果您没有可用的唯一约束,您应该锁定表以确保在您的命令之间没有发生其他更新。
关于MySql COUNT(*) 在存储过程中不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6271069/