【发布时间】:2021-06-03 15:44:02
【问题描述】:
我有一个takes 表,我想将每个成绩记录转换为数值并将其存储在grade_point 表中。
我将grade_point 初始化为:
CREATE TABLE IF NOT EXISTS university.grade_point (
id VARCHAR(5),
grade VARCHAR(2),
grade_value NUMERIC(2 , 1)
);
我可以通过以下方式解决问题:
-
从
takes表中获取id -
从
takes表中获取grade -
如果
grade是A那么grade_value是4.0如果
grade是A-那么grade_value是 3.7 ...
我可以编写以下查询:
insert into grade_point(id, grade, grade_value)
SELECT
id,
grade,
CASE
WHEN grade LIKE 'A' THEN 4.0
WHEN grade LIKE 'A-' THEN 3.7
WHEN grade LIKE 'B+' THEN 3.3
WHEN grade LIKE 'B' THEN 3.0
END AS grade_value
FROM
takes;
我想知道我是否可以使用 procedure 做到这一点?
灵感来自How can I loop through all rows of a table (MySQL) 的公认解决方案:
-
对于
takes表中的每个grade记录-
选择
ith 行 -
获取
id、grade并将grade转换为grade_value -
将其插入
grade_point
-
-
结果是:
delimiter
create procedure update_grade_point()
begin
declare n int default 0
declare i int default 0
select count(grade) from takes into n
set i = 0
while i < n do
insert into grade_point(id, grade, grade_value)
select id, grade,
case
when grade like 'A' then 4.0
when grade like 'A-' then 3.7
when grade like 'B+' then 3.3
when grade like 'B' then 3.0
end as grade_value
from
takes
limit i, 1;
set i = i + 1
end while
end;
delimiter ;
但是,上面的查询响应为:
0 行受影响,1 个警告:1050 表 'grade_point' 已存在
当删除 grade_point 表并重新执行查询时,我得到以下响应
0 行受影响
没有任何东西被插入到grade_point 表中。
您能告诉我我的procedure 中缺少什么或错误吗?
问候。
【问题讨论】:
-
INSERT tablename (column1, column2, colmn3) VALUES (value1, value2, value3)是正确的INSERT语法。你没有输入任何VALUES。 -
你为什么要用一个缓慢而讨厌的程序解决方案来替换完美、时尚、基于集合和高性能的
INSERT ... SELECT ...? -
再想一想:
grade_point应该建模的表是什么?成绩的数字和字母表示之间的关系?在这种情况下,您不想根据takes的行来填充它,而只是一次,每个可能 等级(不一定当前存在于takes)中的一行。 (然后更改takes,使grade是指向grade_point中记录的外键。) -
是的,创建过程不会插入、更新或删除任何行。您需要执行该过程,以便其主体中的任何
INSERT(或UPDATE或DELETE)语句都有效。 (如果这就是您的问题。要破译您拥有和想要什么以及问题是什么有点困难。至少对我来说......) -
@stickybit 我试图想象书籍问题先生。这个问题与现实世界的问题无关。我目前正在为一个麻烦的考试工作。感谢您与我分享您的想法。问候
标签: mysql