MySQL中的迁移脚本

时间:2014-02-22 10:43:17

标签: php mysql

我想从一个表到另一个表执行迁移数据。

我为自己的目的编写了一个简单的PHP脚本,但我想通过MySql脚本使用用户定义的变量来完成这个:

PHP脚本如下所示:

    //MIGRATION
$sql = "SELECT position FROM ts_user_config WHERE position != '' AND position NOT REGEXP '^-?[0-9]+$' GROUP BY TRIM(position) ORDER BY position";
$positions = db_loadColumn( $sql );

foreach ($positions as $key => $pos) {
    $sql = "SELECT id FROM user_positions where UPPER(position) = UPPER('$pos')";
    $posId = db_loadResult($sql);

    if ($posId == null) {
        $sql = "INSERT INTO user_positions (position, `desc`) VALUES ('$pos', '$pos')";
        db_exec($sql);
        $posId = db_insert_id();
    }

    $sql = "UPDATE ts_user_config SET position='$posId' WHERE TRIM(position)='$pos'";
    db_exec($sql);
}
//---------

有人可以如此善意并将此PHP指令重写为MySQL脚本吗?我试图这样做,但我的mySQL知识非常低,我无法做到。

如果没有太多努力,请帮助我。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

我已经完成了!!!!!! :) 这是我的mySQL脚本,我不知道它是否完美,但它做我需要的。请告诉我,我是否可以在这里做些更好的事情。再次感谢:)

drop procedure if exists PositionMigration;
delimiter '//'
CREATE PROCEDURE PositionMigration()
    BEGIN
        BLOCK1: BEGIN
            DECLARE done INT DEFAULT FALSE;
            DECLARE pos VARCHAR(100);
            DECLARE posId1 INT;
            DECLARE posId2 INT;
            DECLARE sql1 CURSOR FOR SELECT position FROM ts_user_config WHERE position != '' AND position NOT REGEXP '^-?[0-9]+$' GROUP BY TRIM(position) ORDER BY position;
            DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
            OPEN sql1;

            read_loop: LOOP
                FETCH sql1 INTO pos;
                IF done THEN
                    LEAVE read_loop;
                END IF;

                BLOCK2: BEGIN
                    DECLARE posNotFound INT DEFAULT FALSE;
                    DECLARE sql2 CURSOR FOR SELECT id FROM user_positions where UPPER(position) = UPPER(pos);
                    DECLARE CONTINUE HANDLER FOR NOT FOUND SET posNotFound = TRUE; 
                    OPEN sql2;
                    FETCH sql2 INTO posId1;

                    IF posNotFound THEN
                        INSERT INTO user_positions (position, \`desc\`) VALUES (pos, pos);

                        BLOCK3: BEGIN
                            DECLARE sql3 CURSOR FOR SELECT LAST_INSERT_ID();
                            OPEN sql3;
                            FETCH sql3 INTO posId2;
                            UPDATE ts_user_config SET position=posId2 WHERE TRIM(position)=pos;
                            CLOSE sql3;
                        END BLOCK3;
                    ELSE
                        UPDATE ts_user_config SET position=posId1 WHERE TRIM(position)=pos;
                    END IF;
                    CLOSE sql2;
                END BLOCK2;
            END LOOP;
            CLOSE sql1;
        END BLOCK1;
END;
//
delimiter ';'
call PositionMigration();