Author: admin

  • MySQL – data migration example

    [adsense id=”0514458240″ width=”468″ height=”60″]

    Data migrations from one database to another can give rise to unusual processing requests. In this example, a temporary table has been created and has been populated with data. The table consists of three columns: f1 int, f2 int and f3 which is a string. The 3rd column contains information in the form “a,b,c” or “a-b-c” or “a;b;c”. The information in the 3rd column must be expanded out to insert information into the live table with records { f1, f2, “a”}, {f1, f2, “b”} and {f1, f2, “c”}.

    1 9 a,b,c
    2 9 a;b;c
    3 9 a-b-c
    

    Should return

    1 9 a
    1 9 b
    1 9 c
    2 9 a
    2 9 b
    2 9 c
    3 9 a
    3 9 b
    3 9 c
    

    There are two ways to perform this action, the first is pre-loading the information into the database expand the data out using command line tools such as awk or create a store procedure which takes the data and merges it into the live table.

    The sample code provided here deals with the second scenario.

    DROP TABLE IF EXISTS tmp_info;
    CREATE TABLE tmp_info(f1 int, f2 int, f3 varchar(20));
    INSERT INTO tmp_info VALUES (1, 9, 'a,b,c');
    INSERT INTO tmp_info VALUES (2, 9, 'a;b;c');
    INSERT INTO tmp_info VALUES (3, 9, 'a-b-c');
    DROP TABLE IF EXISTS t_info;
    CREATE TABLE t_info(f1 int, f2 int, f3 varchar(20));
    DROP PROCEDURE IF EXISTS appenddata;
    DELIMITER $$
    CREATE PROCEDURE appenddata()
    BEGIN
    	DECLARE done INT DEFAULT 0;
    	DECLARE a,b INT;
    	DECLARE lstart, lend INT;
    	DECLARE c VARCHAR(20);
    	DECLARE cur CURSOR FOR SELECT f1,f2,f3 FROM tmp_info;
    	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    	OPEN cur;
    	read_loop: LOOP
    		FETCH cur INTO a, b, c;
    		IF done THEN
    			LEAVE read_loop;
    		END IF;
    		-- Keep all using the same format
    		SET c = REPLACE(c, ";", ",");
    		SET c = REPLACE(c, "-", ",");
    		SET lstart = 1;
    		SET lend = LOCATE(",", c, lstart);
    		WHILE lend > 0 DO
    			INSERT INTO t_info(f1, f2, f3) VALUES (a, b, SUBSTRING(c, lstart, lend-lstart));
    			SET lstart = lend+1;
    			SET lend = LOCATE(",", c, lstart);
    		END WHILE;
    		IF c <> "" THEN
    			INSERT INTO t_info(f1, f2, f3) VALUES (a, b, SUBSTRING(c, lstart));
    		END IF;
    	END LOOP;
    	CLOSE cur;
    END;
    $$
    DELIMITER ;
    call appenddata();
    SELECT * FROM t_info;
    

    The output from this process is as follows:

    f1	f2	f3
    1	9	a
    1	9	b
    1	9	c
    2	9	a
    2	9	b
    2	9	c
    3	9	a
    3	9	b
    3	9	c