mysql - 使用存储过程中的循环增量创建表

标签 mysql

我们有一大段复杂的 SQL 代码,在 HeidiSQL 和 MySQL WB 中运行时不断崩溃。如果我们使用较少数量的记录运行相同的代码,则它可以正常运行。 我们认为,如果我们在 SP 中创建一个循环,其中代码被有效地分成 10 到 20 次运行,那么它可能会成功完成。我认为这可能涉及创建 10 到 20 个表,稍后将这些表联合为一个表。

尝试在较小的数据集上运行,运行良好。尝试增加服务器 RAM 和磁盘空间。尝试以多种不同的方式调整代码。

我意识到这可能不是理想的解决方案,但已被要求这样做。如果有人能帮助我编写代码,我将不胜感激。

下面是我构建的代码,但不起作用......

DELIMITER $$
 DROP PROCEDURE IF EXISTS test_mysql_while_loop$$
 CREATE PROCEDURE test_mysql_while_loop()
 BEGIN
 DECLARE x  INT;

 SET x = 100;

 WHILE x  <= 2000 DO

   DROP TABLE if EXISTS tablex; /* want to end up with table100-table2000 */

   CREATE TABLE tablex AS (
   SELECT t1.*
    FROM bigtables t1
    WHERE urn BETWEEN x AND x+101); /* select records where the URN is between 100 and 201 in 1st instance , 200 and 301 in second etc*/

    SET x=x+100;

 END WHILE;

 END$$
DELIMITER ;

CALL test_mysql_while_loop();

20 table

最佳答案

这是如何准备和执行语句的简化示例

 DROP PROCEDURE IF EXISTS p;
 delimiter $$
 CREATE PROCEDURE p()
 BEGIN
 DECLARE x  INT;

 SET x = 100;

 WHILE x  <= 300 DO

   set @sql= (select concat('DROP TABLE if EXISTS table',x)); 

   select @sql;
   prepare sqlstmt from @sql;
   execute sqlstmt;
   deallocate prepare sqlstmt;

   set @sql = (select concat('CREATE TABLE table',x,' AS 
   SELECT t1.*
    FROM users t1;'));

    select @sql;
   prepare sqlstmt from @sql;
   execute sqlstmt;
   deallocate prepare sqlstmt; 

     SET x=x+100;

 END WHILE;

 END$$
DELIMITER ;

CALL p();

关于mysql - 使用存储过程中的循环增量创建表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56152723/

相关文章:

php - 简单的 PHP 错误

mysql - 从多个表中按 ID 和时间分组进行选择

mysql - 如何从表格和最多两个其他项目中进行选择

mysql - DBIx::新建和创建类错误

java - 如何找到与另一个表中的时间戳最接近的表中的时间戳(MySQL)

mysql - 如何用一条语句在两个表中执行一条SQL插入语句?

使用 MAX() 优化 MySQL 查询

mysql - MySQL 查询保持同步计数列的困难

php - 生成 11,000,000 个唯一 ID 的最快方法

mysql - 在 where 子句上查找空值时查询不起作用