CREATE DEFINER=`PIDSroot`@`192.168.30.%` PROCEDURE `CreateJuneDataTables`()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE tableName CHAR(255);
DECLARE hasDateColumn INT;
DECLARE cur CURSOR FOR
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'middle'
AND TABLE_NAME LIKE '%202306';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO tableName;
IF done THEN
LEAVE read_loop;
END IF;
SET @sql = CONCAT('SELECT COUNT(*) INTO @hasDateColumn FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ''middle'' AND TABLE_NAME = ''', tableName, ''' AND COLUMN_NAME = ''sjsj''');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
IF @hasDateColumn = 0 THEN
ITERATE read_loop;
END IF;
SET @sql = CONCAT('DROP TABLE IF EXISTS ', tableName, '_20230626');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @sql = CONCAT('CREATE TABLE ', tableName, '_20230626 LIKE ', tableName);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @offset = 0;
batch_loop: LOOP
SET @sql = CONCAT('INSERT INTO ', tableName, '_20230626 SELECT * FROM ', tableName,
' WHERE sjsj >= ''2023-06-15 00:00:00'' AND sjsj < ''2023-06-27 00:00:00'' LIMIT 1000 OFFSET ', @offset);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
IF ROW_COUNT() = 0 THEN
LEAVE batch_loop;
END IF;
SET @offset = @offset + 1000;
END LOOP;
END LOOP;
CLOSE cur;
END
这个储存过程应该是一千行一千行的插入,直到原始表没有数据。但是,新表只有1000行数据。