2014-02-22 64 views
1

我想将一个表中的数据迁移到另一个表中。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知识非常低,我无法做到这一点。

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

预先感谢您。

回答

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