【问题标题】:Generate multiple query string and execute one by one生成多个查询字符串并一一执行
【发布时间】:2016-04-04 07:33:44
【问题描述】:

表结构:

CREATE TABLE IF NOT EXISTS mysql.`my_autoinc` (
    `table_schema` VARCHAR(64) NOT NULL,
    `table_name` VARCHAR(64) NOT NULL,
    `auto_increment` INT(11) UNSIGNED NULL DEFAULT NULL, PRIMARY KEY (`table_schema`, `table_name`)
) ENGINE=InnoDB;

查询 1: 任何 DB 中名为 table1table2 的所有表的列表。

REPLACE INTO mysql.`my_autoinc`
SELECT table_schema, table_name, NULL AS `auto_increment`
FROM information_schema.tables
WHERE table_name IN ("table1", "table2");

查询 1 可能会生成

table_schema  |  table_name  |  auto_increment
===============================================
 client_1     | table1       |    NULL
 client_1     | table2       |    NULL
 client_2     | table1       |    NULL
 client_3     | table1       |    NULL

查询 2: 查询字符串列表。

SELECT CONCAT(
    'REPLACE INTO my_autoinc ',
    'SELECT "',table_schema,'", "',table_name,'", MAX(Id) FROM ', 
    '('
        'SELECT MAX(Id) AS Id FROM ', table_schema, '.', table_name,
        ' UNION ',
        'SELECT MAX(Id) AS Id FROM ', table_schema, '_history.', table_name, '_history',
    ') t'
) AS 'queries'
FROM my_autoinc;

查询2生成的查询列表被执行时。

table_schema  |  table_name  |  auto_increment
===============================================
 client_1     | table1       |    99
 client_1     | table2       |    60
 client_2     | table1       |    299
 client_3     | table1       |    399

我已经试过了: GROUP_CONCAT 但是字符串的串联长度超过了 1000。所以,无法执行该长度的查询。

更新:我不能multiple statements in a prepare

需要解决方案:逐一执行查询 2 生成的查询。

【问题讨论】:

    标签: mysql database auto-increment


    【解决方案1】:

    您可以从 GROUP_CONCAT 设置最大长度

    -- for the session
    SET SESSION group_concat_max_len = 1000000;
    
    -- or global
    SET GLOBAL group_concat_max_len = 1000000;
    

    【讨论】:

    【解决方案2】:

    你可以用这样的存储过程来做,然后调用它:

    DELIMITER $$
    CREATE PROCEDURE doAllThings()
    BEGIN
      DECLARE cursor_VAL VARCHAR(2000);
      DECLARE done INT DEFAULT FALSE;
    
      DECLARE cursor_i CURSOR FOR
        SELECT CONCAT('REPLACE INTO mysql.my_autoinc ','SELECT "',table_schema,'", "',TABLE_NAME,'", MAX(Id) FROM ', '(SELECT MAX(Id) AS Id FROM ', table_schema, '.',TABLE_NAME,' UNION ','SELECT MAX(Id) AS Id FROM ', table_schema, '_history.', TABLE_NAME, '_history',') t') AS 'queries' FROM mysql.my_autoinc;
    
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    
      OPEN cursor_i;
      read_loop: LOOP
        FETCH cursor_i INTO cursor_VAL;
        IF done THEN
          LEAVE read_loop;
        END IF;
    
        SET @SQL := queries;
        PREPARE stmt FROM @SQL;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;     
    
      END LOOP;
      CLOSE cursor_i;
    END$$
    DELIMITER ;
    
    
    -- call it
    call doAllThings();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      • 2017-09-19
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 2017-05-24
      • 2021-09-12
      相关资源
      最近更新 更多