在所有表中插入单独的table_name作为列值

时间:2018-07-10 06:08:38

标签: mysql procedure information-schema tablename

我使用一个数据库,该数据库包含数百个具有相同结构和相同语法的表。每天都会创建更多表,因此数据库在不断增长。为了动态地添加数量不断增加的表,我使用了一个MySQL过程,该过程很好用。

但是一旦附加,我就无法识别行的起源,因为表不包含任何要区分的信息。因此,我想在以下过程中集成MySQL语句,以自动从TABLE_NAME获取information_schema并将其设置为相应表中的值。我已经为此创建了一个专栏,但是在调整程序方面遇到了困难。对于解决此问题的任何帮助或建议,我将非常感谢。

CREATE PROCEDURE getallarbeitsplaene(recordOffset INT, recordCount INT)

BEGIN
    DECLARE tableName VARCHAR(255);
    DECLARE endOfTables INT DEFAULT 0;

    DECLARE cur CURSOR FOR
        SELECT t.table_name
        FROM information_schema.tables t
        WHERE t.table_schema = DATABASE()
          AND t.table_type='BASE TABLE'
                        AND    NOT table_name LIKE '%x_arbeitsplan'
                        AND table_name LIKE '%_arbeitsplan';

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET endOfTables = 1;

    DROP TEMPORARY TABLE IF EXISTS alle_plaene;

    CREATE TEMPORARY TABLE alle_plaene (
        `ID` INT(11) NOT NULL,
        `AP` VARCHAR(8) NOT NULL,
                    `Name` VARCHAR(128) NOT NULL,
                    `Baugruppentyp` VARCHAR(128) NOT NULL,
                    `Basiseinheit` VARCHAR(8) NOT NULL,
                    `Zeit_Basiseinheit` NUMERIC(10,0) NOT NULL,
                    `vor_OF` BINARY(1) NOT NULL,
                    `zwischen_OF` BINARY(1) NOT NULL,
                    `nach_OF` BINARY(1) NOT NULL,
                    `Annahme_Grundlage` VARCHAR(64) NOT NULL,
                    `Budget_AG_Bankraum` VARCHAR(7) NOT NULL,
                    `Budget_AG_FU` VARCHAR(7) NOT NULL,
                    `Datum_voraus` DATE,
                    `Budget_voraus` INT(11) NOT NULL
                    ) ENGINE=MEMORY;

    OPEN cur;

    tablesLoop: LOOP
        FETCH cur INTO tableName;

        IF endOfTables = 1 THEN
            LEAVE tablesLoop;
        END IF;

        SET @s = CONCAT('INSERT INTO alle_plaene (Name, Baugruppentyp, Basiseinheit, Zeit_Basiseinheit, vor_OF, zwischen_OF, nach_OF, Annahme_Grundlage, Budget_AG_Bankraum, Budget_AG_FU, Datum_voraus, Budget_voraus) SELECT `Name`, `Baugruppentyp`, `Basiseinheit`, `Zeit_Basiseinheit`, `vor_OF`, `zwischen_OF`, `nach_OF`, `Annahme_Grundlage`, `Budget_AG_Bankraum`, `Budget_AG_FU`, `Datum_voraus`, `Budget_voraus`   FROM ', tableName, ' ORDER BY ID DESC');
        PREPARE stmt FROM @s;
        EXECUTE stmt;

    END LOOP;

    CLOSE cur;

    SELECT `Name`, `Baugruppentyp`, `Basiseinheit`, `Zeit_Basiseinheit`, `vor_OF`, `zwischen_OF`, `nach_OF`, `Annahme_Grundlage`, `Budget_AG_Bankraum`, `Budget_AG_FU`, `Datum_voraus`, `Budget_voraus` FROM alle_plaene;

END 

1 个答案:

答案 0 :(得分:0)

这应该有效

    DELIMITER //

    DROP PROCEDURE IF EXISTS getallarbeitsplaene //
    CREATE PROCEDURE getallarbeitsplaene()
    BEGIN
        DECLARE tableName VARCHAR(64);
        DECLARE endOfTables INT DEFAULT 0;

        DECLARE cur CURSOR FOR
            SELECT t.table_name
            FROM information_schema.tables t
            WHERE t.table_schema = DATABASE()
              AND t.table_type='BASE TABLE'
              AND NOT table_name LIKE '%x_arbeitsplan'
              AND table_name LIKE '%_arbeitsplan';

        DECLARE CONTINUE HANDLER FOR NOT FOUND SET endOfTables = 1;

        DROP TEMPORARY TABLE IF EXISTS alle_plaene;

        CREATE TEMPORARY TABLE alle_plaene (
          `ID` INT(11) NOT NULL,
          `AP` VARCHAR(8) NOT NULL,
          `Name` VARCHAR(128) NOT NULL,
          `Baugruppentyp` VARCHAR(128) NOT NULL,
          `Basiseinheit` VARCHAR(8) NOT NULL,
          `Zeit_Basiseinheit` NUMERIC(10,0) NOT NULL,
          `vor_OF` BINARY(1) NOT NULL,
          `zwischen_OF` BINARY(1) NOT NULL,
          `nach_OF` BINARY(1) NOT NULL,
          `Annahme_Grundlage` VARCHAR(64) NOT NULL,
          `Budget_AG_Bankraum` VARCHAR(7) NOT NULL,
          `Budget_AG_FU` VARCHAR(7) NOT NULL,
          `Datum_voraus` DATE,
          `Budget_voraus` INT(11) NOT NULL,
          `tableName` VARCHAR(64) NOT NULL
        ) ENGINE=MEMORY;

        OPEN cur;

        tablesLoop: LOOP
          FETCH cur INTO tableName;

          IF endOfTables = 1 THEN
            LEAVE tablesLoop;
          END IF;

          SET @s = CONCAT('INSERT INTO alle_plaene (ID, AP, Name, Baugruppentyp, Basiseinheit, Zeit_Basiseinheit, vor_OF, zwischen_OF, nach_OF, Annahme_Grundlage, Budget_AG_Bankraum, Budget_AG_FU, Datum_voraus, Budget_voraus, tableName)  SELECT `ID`, `AP`, `Name`, `Baugruppentyp`, `Basiseinheit`, `Zeit_Basiseinheit`, `vor_OF`, `zwischen_OF`, `nach_OF`, `Annahme_Grundlage`, `Budget_AG_Bankraum`, `Budget_AG_FU`, `Datum_voraus`, `Budget_voraus`, ''', tableName, ''' FROM `', tableName, '` ORDER BY ID DESC');
          PREPARE stmt FROM @s;
          EXECUTE stmt;
          DEALLOCATE PREPARE stmt;
        END LOOP;

        CLOSE cur;

        SELECT * FROM alle_plaene;

    END //

DELIMITER ;

call getallarbeitsplaene();

此解决方案仅在几个地方与您的版本不同,但是这里有一些要考虑的地方

information_schema.table_name是VARCHAR(64)。

您没有在代码中使用任何一个输入参数,因此我将其删除。

您应该将table_name添加到临时表中,并在@s = CONCAT(...)语句中用带引号的字符串填充该列。

IDAP列需要填充到临时表中或完全删除,您将它们设置为NOT NULL,因此它们必须获取值。

我不禁想知道为什么您每天都要创建多个相同的表,只是为了将临时表中的输出组合在一起以进行查询,所以肯定有一个表解决方案会更好。