用存储过程,将总表中的数据按照一定规则迁移到新的分表中。
USE tobresume;
DROP PROCEDURE IF EXISTS Dist_talent;
DELIMITER $$
CREATE PROCEDURE Dist_talent()
BEGIN
DECLARE db_name VARCHAR(20);
DECLARE table_name VARCHAR(20);
DECLARE table_pro CHAR(18);
DECLARE sql_text VARCHAR(3000);
DECLARE i INT;
DECLARE j VARCHAR(20);
SET db_name='tobresume';
SET table_name='';
SET table_pro = '_talent_dir_resume';
SET sql_text='';
SET i=0;
SET j='';
WHILE i<=128 DO
IF i<10 THEN
SET j=CONCAT('0',i);
ELSE
SET j=LPAD(LCASE(HEX(i)),2,'0');
END IF;
SET table_name=CONCAT(j,table_pro);
SET sql_text=CONCAT('INSERT INTO ', db_name, '.', table_name, '(uid,top_id,dir_id,parent_id,resume_id,is_deleted,created,updated) ', 'SELECT uid,top_id,dir_id,parent_id,resume_id,is_deleted,created,updated FROM talent_dir_resume WHERE lower(lpad(conv(floor(conv(left(md5(top_id),2),16,10)/2),10,16),2,\'0\'))=\'', j, '\';');
SELECT sql_text;
SET @sql_text=sql_text;
PREPARE stmt FROM @sql_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET i=i+1;
END WHILE;
END$$
DELIMITER ;
call Dist_talent();
结果:
+-----------------------------------------------------------------------------------------+
| sql_text |
+--------------------------------------------------------------------------------------------------+
| INSERT INTO tobresume.80_talent_dir_resume(uid,top_id,dir_id,parent_id,resume_id,is_deleted,created,updated) SELECT uid,top_id,dir_id,parent_id,resume_id,is_deleted,created,updated FROM talent_dir_resume WHERE lower(lpad(conv(floor(conv(left(md5(top_id),2),16,10)/2),10,16),2,'0'))='80'; |
+-----------------------------------------------------------------------------------------+
1 row in set (1.33 sec)
Query OK, 0 rows affected (1.34 sec)
mysql> select count(1) from 21_talent_dir_resume;
+----------+
| count(1) |
+----------+
| 966 |
+----------+
1 row in set (0.00 sec)
注意: 使用存储过程要注意主从分离的情况。