MySql-在while循环中插入到表中

MySql-在while循环中插入到表中,mysql,Mysql,我有一个takes表,我想将每个成绩记录转换为数值,并将其存储在grade_point表中 我将grade_点初始化为: 创建表格(如果不存在)。大学成绩\ U点 瓦查尔5号, VARCHAR2级, 等级\数值2,1 ; 我可以通过以下方式处理此问题: 从表中获取id 从表格中获得分数 如果坡度为A,则坡度_值为4.0 如果等级为A,则等级_值为3.7 我可以编写以下查询: 插入到grade_pointid、grade、grade_值中 选择 身份证件 等级 案例 当等级为“A”时,则为4.0

我有一个takes表,我想将每个成绩记录转换为数值,并将其存储在grade_point表中

我将grade_点初始化为:

创建表格(如果不存在)。大学成绩\ U点 瓦查尔5号, VARCHAR2级, 等级\数值2,1 ; 我可以通过以下方式处理此问题:

从表中获取id

从表格中获得分数

如果坡度为A,则坡度_值为4.0

如果等级为A,则等级_值为3.7

我可以编写以下查询:

插入到grade_pointid、grade、grade_值中 选择 身份证件 等级 案例 当等级为“A”时,则为4.0 当等级为“A-”时,则为3.7 当等级为“B+”时,则为3.3 当等级为“B”时,则为3.0 以等级\ U值结束 从…起 拿; 我想知道我是否可以用这个程序来做

受以下公认解决方案的启发:

对于takes表中的每个成绩记录

选择第i行

获取id、等级并将等级转换为等级值

将其插入坡率点

结果是:

分隔符 创建程序更新\等级\点 开始 声明n int默认值为0 声明i int默认值为0 从n中选择countgrade 集合i=0 而我 插入到grade_pointid、grade、grade_值中 选择id、等级、, 案例 当等级为“A”时,则为4.0 当等级为“A-”时,则为3.7 当等级为“B+”时,则为3.3 当等级为“B”时,则为3.0 以等级\ U值结束 从…起 拿 极限i,1; 设置i=i+1 结束时 终止 定界符; 但是,上述查询的答复如下:

0行受影响,1条警告:1050表“grade_point”已存在

当删除grade_point表并重新执行查询时,我有以下响应

0行受影响

未在坡度点表中插入任何内容

你能告诉我我的程序有什么遗漏或错误吗


问候。

我不知道,既然一个简单的插入就足够了,为什么要这样做

但是ij是一个存储过程,可以使用循环


dbfiddle

插入表名column1、column2、colmn3值value1、value2、value3是正确的插入语法。您没有输入任何值。为什么要替换完美、圆滑、基于设置且性能优异的插入。。。选择用一个缓慢而烦人的程序解决方案?再想一想:桌上的grade_点应该是什么样的?等级的数字和字母表示之间的关系?在这种情况下,您不想根据分数行填充它,而只是一次,每一个可能的分数都对应一行,而这些分数不一定当前存在于分数中。然后更改Takes,即grade是指向grade_point中记录的外键。是的,创建过程不会插入、更新或删除任何行。您需要执行该过程,以便其主体中的任何INSERT、UPDATE或DELETE语句都具有任何效果。你应该问这个问题。要弄清楚你拥有什么、想要什么以及问题出在哪里都有点困难。至少对我来说…@stickybit我试图想象书的问题,先生。这个问题与现实世界的问题无关。我目前正在为一个有问题的考试工作。谢谢你和我分享你的想法。Regard我不知道,你为什么要这么做,当一个简单的插入就足够了,我正在准备资格考试。考试社区可以问任何问题。无论如何,谢谢。虽然我不明白为什么dbfiddle会给我的语法带来错误。该查询在MySql Workbench.dbfiddle上运行良好,有一些查询,必须考虑查看,除了尝试下一次使用分隔符$$并添加分号外,它还使ebtter rad和MySql在接受您的样式时在dbfiddle中感到困惑我不知道会发生什么..在接受您的样式时感到困惑。。意思是说?如果分隔符没有实际字符,则通过DBFIDLE关闭其配置。dbfiddle.uk不喜欢分隔符,因为它会自动添加分隔符,正如您在fiddle中看到的那样。就像我说的,了解小提琴网站的所有规则需要一些时间。谢谢你提供的信息,我下次会小心的。当做
CREATE TABLE IF NOT EXISTS  grade_point (
    id VARCHAR(5),
    grade VARCHAR(2),
    grade_value NUMERIC(2 , 1)
);
CREATE TABLE IF NOT EXISTS takes (
    id VARCHAR(5),
    grade VARCHAR(2)
);
INSERT INTO takes VALUES ("1","A"),("2","B"),("3","A"),("4","B")
CREATE PROCEDURE update_grade_point (

)
BEGIN
  DECLARE finished INTEGER DEFAULT 0;
  DECLARE _grade varchar(2) DEFAULT "";
  DECLARE _id varchar(5) DEFAULT "";

  -- declare cursor for employee email
  DEClARE curtakes 
      CURSOR FOR 
          SELECT id,grade FROM takes;

  -- declare NOT FOUND handler
  DECLARE CONTINUE HANDLER 
        FOR NOT FOUND SET finished = 1;

  OPEN curtakes;

  getidGrade: LOOP
      FETCH curtakes INTO _id,_grade;
      IF finished = 1 THEN 
          LEAVE getidGrade;
      END IF;
                insert into grade_point(id, grade, grade_value) VALUES (_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);
  END LOOP getidGrade;
  CLOSE curtakes;

END
CALL update_grade_point()
SELECT * FROM grade_point
id | grade | grade_value :- | :---- | ----------: 1 | A | 4.0 2 | B | 3.0 3 | A | 4.0 4 | B | 3.0