Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySql计数(*)在存储过程中不同_Mysql_Sql_Stored Procedures - Fatal编程技术网

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

MySql计数(*)在存储过程中不同,mysql,sql,stored-procedures,Mysql,Sql,Stored Procedures,我正在开发一个“评分”系统,并试图通过使用一个存储过程来确保一个人不能提交两次评分,该存储过程将在允许保存新评分之前检查一个人是否对特定项目进行了评分。奇怪的是,我正在传递一个用户ID和对象ID,但是当我的存储过程选择COUNT(*)时,我得到了错误的数字 以下是我的存储过程: CREATE PROCEDURE `ADD_GRADE`(IN objectID int, IN grader int) BEGIN DECLARE gradeCount INT; SELECT COUNT(*) FR

我正在开发一个“评分”系统,并试图通过使用一个存储过程来确保一个人不能提交两次评分,该存储过程将在允许保存新评分之前检查一个人是否对特定项目进行了评分。奇怪的是,我正在传递一个用户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;
创建过程'ADD_GRADE'(在objectID int中,在grader int中)
开始
声明gradecountint;
选择计数(*)
分级
其中Obj_ID=objectID,Grader=Grader
进入成绩统计;
如果gradeCount即使此代码有效(我不知道为什么无效),也不能确保只输入一次

正确的方法是对objectID和grader列应用唯一约束。然后尝试插入行。如果行插入,则值是唯一的。如果您得到一个唯一的冲突,那么已经输入了值


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

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

Grader = grader

只是将列与自身进行比较,这总是正确的。您可能需要重命名要传入的参数,使其与现有列的名称不同。我通常让所有存储过程参数都以_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu<代码>计数(*)
不能返回<0(不能少于没有行),因此如果成绩计数<1,您的测试应该是
,然后插入
(注意,如果没有该成绩器和obj_id的行,则插入)。我正在对这两个答案进行升级投票。Scott Bruns在最佳设计方面是正确的,但您对该问题的技术回答也是正确的。将列与自身进行比较正是发生的事情,并且计数将始终是Obj_ID等于objectID的行数,因为and 1的计算结果始终为true。