2014-02-22 28 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();