foreach数据在mysql中将所选字段从一个数据库插入到另一个数据库

xhv8bpkk  于 2021-06-23  发布在  Mysql
关注(0)|答案(2)|浏览(359)

我有两(2)个不同原理图的数据库,
db1从mssql迁移到mysql
以及
从laravel迁移创建的db2。
这里的挑战是:db1的表没有 id 在db2表中很容易找到类似的列(主键)。所以我一直收到警告信息:

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

所以我不得不注射 id db1中表上的列
我需要从db1的stdlist中提取字段[level\u name,class\u name],
在db2上创建级别(id、level\u name、x、y)
db2上的类(id、class\u name、level\u id)
要提供更多信息:level\ id应该来自已经创建的levels表
我已经使用以下代码片段成功地提取了第一个示例:
创建标高的第一个查询

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;

这是成功的。
现在,我需要使用新创建的 id 在levels表中填充level\ id列。要做到这一点,我必须重新运行上述选择示意图吗?没有更好的方法可以将表列从db1.levels连接到db2.stdlist并提取新的insert schematics所需的字段。
我会感激你的帮助。提前谢谢。

f45qwnt8

f45qwnt81#

这就是最终对我起作用的原因:
首先,我从初始数据库中提取级别,因此:

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;

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

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();

有了这个,我就可以扔掉 classes 与先前创建的 level_id s。
整个魔法依赖于 CURSOR 协议。
关于更多细节,这里是我使用的文档之一。

ttcibm8c

ttcibm8c2#

尝试为“已处理”添加列,然后执行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

您可能需要先转储到temp表中,然后在完成处理后插入到实际表(db2.levels)中。这样就不需要在最后一个表上处理不必要的列。

相关问题