【问题标题】:Foreach Data in Field Insert Selected Field from One Database to Another in MySQLForeach 字段中的数据将选定字段从一个数据库插入到 MySQL 中的另一个数据库
【发布时间】:2018-08-08 18:02:44
【问题描述】:

我有两 (2) 个不同原理图数据库,

db1MSSQL 迁移到 MYSQL

db2Laravel 迁移创建。

挑战如下: db1 的表没有id 列(主键),就像在 db2 表上很容易找到一样。所以我不断收到警告信息:

 Current selection does not contain a unique column. Grid edit, checkbox, Edit, Copy and Delete features are not available.

所以我不得不在 db1

的表上注入 id
  1. 我需要从 db1 中的 stdlist 中提取字段 [level_name, class_name],
  2. 在 db2 上创建级别 (id,level_name,X,Y)
  3. db2 上的类(id、class_name、level_id)

更多亮点:level_id 应该来自已创建的 levels

我已经使用下面的 sn-p 成功提取了第一个实例:

创建关卡的第一个查询

INSERT INTO db2.levels(level_name,X,Y)
SELECT class_name as level_name,1 as X,ClassAdmitted as Y
FROM db1.stdlist
GROUP BY ClassAdmitted;

这很成功。

现在,我需要使用levels 表中新创建的ids 来填充classes 表中的level_id 列。 为此,我必须重新运行上述选择原理图吗?有没有更好的方法可以将表列从 db1.levels 连接到 db2.stdlist 并提取新插入原理图所需的字段。

我将不胜感激。提前致谢。

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    尝试为 Processed 添加一列,然后执行 while exists 循环

    INSERT INTO db2.levels(level_name,X,Y)
    SELECT class_name as level_name,1 as X,ClassAdmitted as Y, 0 as Processed
    FROM db1.stdlist
    GROUP BY ClassAdmitted;
    
    WHILE EXISTS(SELECT * FROM db2.levels WHERE Processed = 0)
    BEGIN 
    DECLARE @level_name AS VARCHAR(MAX)
     SELECT TOP 1 @level_name=level_name FROM db2.levels WHERE Processed = 0
    --YOUR CODE
    UPDATE db2.levels SET Processed=1 WHERE level_name=@level_name
    
    END
    

    您可能需要先转储到临时表中,然后在完成处理后插入到您的真实表 (db2.levels) 中。那么你就不需要决赛桌上的 Unnecessary 列了。

    【讨论】:

    • 我相信 Processed 字段必须添加到 db2.levels。至于代码的位置,我不太明白如何用完来自SELECT TOP 1 @level_name=level_name FROM db2.levels WHERE Processed = 0 的数据。回想一下,我之前的 levels 预运行所需要的只是 id
    • 我不知道为什么,但是 `WHILE EXISTS(SELECT * FROM db2.levels WHERE Processed = 0)' 没有运行。它给出了一个错误:> 无法识别的语句类型(靠近 WHILE)
    • 如果我理解正确,您需要将记录插入到“Levels”表中,然后为该记录生成的 ID 需要插入到“Level_Id”表中?您还需要处理这些数据吗?每个表中有哪些列?
    • 是的,你明白我的意思。 levels 表的列是:level_name、shortcode、order_id、timestamps 而第二个表(classes table)包含新生成的级别id, class_name、previous_class 等等。
    • 您的回答为我指明了更深层次的方向,这导致了最终的解决方案。但为了清楚起见,我将发布对我有用的答案。我认为,如果您考虑到此处提到的某些标签和关键字具有其他一些依赖项这一事实,也许这会起作用...例如,我无法让DECLAREPROCEDURE
    【解决方案2】:

    这最终对我有用:

    首先,我从初始数据库中获取了这些级别:

    INSERT INTO db2.levels(`name`,`school_id`,`short_code`)
    SELECT name ,school_id,short_code
    FROM db1.levels 
    GROUP BY name 
    ORDER BY  CAST(IF(REPLACE(name,' ','')='','0',REPLACE(name,' ','')) AS UNSIGNED 
    INTEGER) ASC;
    

    然后我为类插入创建了一个 PROCEDURE

    CREATE PROCEDURE dowhileClasses()
    BEGIN
    SET @Level = 1;
    SET @Max = SELECT count(`id`) FROM  db2.levels;
    START TRANSACTION;
    WHILE @Level <= @Max  DO
        BEGIN
             DECLARE val1 VARCHAR(255) DEFAULT NULL;
             DECLARE val2 VARCHAR(255) DEFAULT NULL;
             DECLARE bDone TINYINT DEFAULT 0;
             DECLARE curs CURSOR FOR 
                SELECT trim(`Class1`)
                FROM db1.dbo_tblstudent 
                WHERE CAST(IF(REPLACE(name,' ','')='','0',REPLACE(name,' ','')) AS UNSIGNED INTEGER) =@Level
                GROUP BY `Class1`;
             DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1;
             OPEN curs;
             SET bDone = 0;
             REPEAT
                FETCH curs INTO val1;
                IF bDone = 0 THEN 
                    SET @classname = val1;
                    SET @levelID = (SELECT id FROM db2.levels WHERE short_code=@Level limit 1);
                    SET @schoolId = 1;
                        SET @classId = (SELECT `id` FROM db2.classes where class_name = @classname and level_id= @levelID limit 1);
                        
                        IF @classId is null and @classname is not null THEN
                            INSERT INTO db2.classes(class_name,school_id,level_id)
                                VALUES(@classname,@schoolId,@levelID);
                        END IF;
                    END IF;
             UNTIL bDone END REPEAT;
             CLOSE curs;
        END;
         SELECT CONCAT('lEVEL: ',@Level,' Done');
        SET @Level = @Level + 1;
      END WHILE;
    END;
    //
    
    delimiter ;
    
    CALL dowhileClasses();
    

    有了这个,我能够转储与之前创建的level_ids 匹配的classes 配置文件。

    整个魔法依赖于CURSOR 协议。

    更多详情here is one of the documentations我用过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-02
      • 2014-02-23
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      • 2011-04-18
      • 2023-04-03
      相关资源
      最近更新 更多