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

标签 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 似乎忽略了评分者 ID,只是根据 Obj_ID 进行检查。我已经添加了选择以确保我的参数保持在正确的值并且它们是。如果我只复制选择并在其他地方手动执行,我会得到正确的数字。

虽然我是 MySql 的新手,但我对 SQL 本身并不陌生。我要疯了吗?还是我做错了什么?

谢谢

最佳答案

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

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

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

关于MySql COUNT(*) 在存储过程中不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6271069/

相关文章:

sql-server - 如何强制死锁来测试存储过程的try/catch?

php - 制作动态下拉导航系统

mysql - Spring @Transactional 死锁

sql - 时间戳 : db2 query 中的微秒

mysql - 找到一对参加完全相同类(class)的学生

mysql - 计算 2 个不同表中 2 列之间的百分比

asp.net-mvc - 将存储过程与具有附加参数的 Linq To Sql 一起使用

sql - 我们可以在 SQL Server 中使用 while 循环将记录存储在临时表中吗?

mysql - 如何使用sql对按字母顺序排序的字符串中的单词进行排序

php - 如何比较数组并返回差异php