CALL set_stu_score('201810101101', '1001', 20);为什么改变了两次数据
时间: 2023-12-25 11:03:58 浏览: 65
很抱歉,我之前回答的有误。您执行的`CALL set_stu_score('201810101101', '1001', 20)`语句,只会将score字段的值设置为20,而不是累加20。
如果您希望将score字段的值加上20,可以修改set_stu_score存储过程的代码,使用以下的UPDATE语句:
```
UPDATE course_selection SET score = score + IN_score WHERE stu_id = IN_stu_id AND course_id = IN_course_id;
```
这样,每次执行存储过程时,就会将指定学生和指定课程的成绩加上IN_score指定的值。例如:
```
CALL set_stu_score('201810101101', '1001', 20);
```
执行以上语句后,会将学号为201810101101、课程号为1001的选课记录的成绩加上20。如果再次执行同样的语句,那么该选课记录的成绩会再次加上20,因此您观察到的是成绩改变了两次。
相关问题
DELIMITER $$ CREATE PROCEDURE set_stu_score ( IN stu_id VARCHAR(20), IN course_id VARCHAR(20), IN score DECIMAL(5,2) ) BEGIN UPDATE choose SET score = score WHERE student_id = stu_id AND course_id = course_id; END $$ DELIMITER ; -- 执行存储过程 CALL set_stu_score('201810101101', '1001', 90);
您的代码几乎正确,但是有一个小错误:在UPDATE语句中,score = score并没有改变原有的score值,需要将它改成score = @score。另外,存储过程中的table名字是choose,而不是student_course,如果您的数据库中不存在choose表,需要将表名改成您的表名。
以下是经过修改后的代码:
```sql
DELIMITER $$
CREATE PROCEDURE set_stu_score (
IN stu_id VARCHAR(20),
IN course_id VARCHAR(20),
IN score DECIMAL(5,2)
)
BEGIN
UPDATE choose
SET score = @score
WHERE student_id = stu_id AND course_id = course_id;
END $$
DELIMITER ;
-- 执行存储过程
CALL set_stu_score('201810101101', '1001', 90);
```
注意,我们在存储过程中使用了参数@score来更新成绩,参数名字与传入的参数score不一样,这是因为参数名字和列名字相同会导致歧义。同时,我们在调用存储过程时,需要使用CALL命令。如果您的存储过程执行成功,会返回一个"Query OK"的提示信息。
CALL set_stu_score('201810101101', '1001', 90)为什么导致studentidcourseid=‘1001’和courseid=‘1002’的值都变成了90
很抱歉,我的回答还是有误。执行`CALL set_stu_score('201810101101', '1001', 90)`语句,会将学号为201810101101、课程号为1001的选课记录的成绩设置为90,而不是将学号为201810101101、课程号为1001和1002的选课记录的成绩都设置为90。
根据您提供的信息,猜测可能是set_stu_score存储过程的代码有问题,导致将course_selection表中符合条件的所有记录的成绩都设置成了IN_score指定的值。请检查一下set_stu_score存储过程的代码是否如下所示:
```
UPDATE course_selection SET score = IN_score WHERE stu_id = IN_stu_id AND course_id = IN_course_id;
```
如果是以上的UPDATE语句,就会将所有符合条件的记录的成绩都设置为IN_score指定的值,而不是只更新一条记录。如果您只想更新一条记录,请使用以下的UPDATE语句:
```
UPDATE course_selection SET score = IN_score WHERE stu_id = IN_stu_id AND course_id = IN_course_id LIMIT 1;
```
这样就可以将符合条件的第一条记录的成绩更新为IN_score指定的值了。
阅读全文