我正在开发一个“评分”系统,并试图通过使用存储过程来确保一个人无法提交两次成绩,该过程将检查一个人是否在允许新成绩之前对特定项目进行了评分保存。奇怪的是,我正在传递用户 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 本身并不陌生。我只是要疯了吗?还是我做错了什么?

谢谢

最佳答案

即使此代码有效(我不知道为什么无效),这也不是确保某些内容只输入一次的正确方法。

正确的方法是对 objectID 和 Grader 列应用唯一约束。然后尝试插入行。如果行插入,则值是唯一的。如果您遇到唯一违规,则说明已经输入了这些值。

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

10-06 14:37