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

9fkzdhlc  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(440)

我使用的数据库有数百个表,这些表的结构和语法都非常相同。每天创建更多的表,因此数据库不断增长。为了动态追加数量不断增加的表,我使用 MySQL 这个程序很有效。
但是,一旦附加了行,我就无法识别行的起源,因为表不存在´不包含任何需要区分的信息。因此,我想集成一个 MySQL 语句自动获取 TABLE_NAMEinformation_schema 在相应的表中设置为一个值。我已经为此创建了一个专栏,但正在努力调整程序。我真的很感激任何帮助或建议来解决这个问题。

  1. CREATE PROCEDURE getallarbeitsplaene(recordOffset INT, recordCount INT)
  2. BEGIN
  3. DECLARE tableName VARCHAR(255);
  4. DECLARE endOfTables INT DEFAULT 0;
  5. DECLARE cur CURSOR FOR
  6. SELECT t.table_name
  7. FROM information_schema.tables t
  8. WHERE t.table_schema = DATABASE()
  9. AND t.table_type='BASE TABLE'
  10. AND NOT table_name LIKE '%x_arbeitsplan'
  11. AND table_name LIKE '%_arbeitsplan';
  12. DECLARE CONTINUE HANDLER FOR NOT FOUND SET endOfTables = 1;
  13. DROP TEMPORARY TABLE IF EXISTS alle_plaene;
  14. CREATE TEMPORARY TABLE alle_plaene (
  15. `ID` INT(11) NOT NULL,
  16. `AP` VARCHAR(8) NOT NULL,
  17. `Name` VARCHAR(128) NOT NULL,
  18. `Baugruppentyp` VARCHAR(128) NOT NULL,
  19. `Basiseinheit` VARCHAR(8) NOT NULL,
  20. `Zeit_Basiseinheit` NUMERIC(10,0) NOT NULL,
  21. `vor_OF` BINARY(1) NOT NULL,
  22. `zwischen_OF` BINARY(1) NOT NULL,
  23. `nach_OF` BINARY(1) NOT NULL,
  24. `Annahme_Grundlage` VARCHAR(64) NOT NULL,
  25. `Budget_AG_Bankraum` VARCHAR(7) NOT NULL,
  26. `Budget_AG_FU` VARCHAR(7) NOT NULL,
  27. `Datum_voraus` DATE,
  28. `Budget_voraus` INT(11) NOT NULL
  29. ) ENGINE=MEMORY;
  30. OPEN cur;
  31. tablesLoop: LOOP
  32. FETCH cur INTO tableName;
  33. IF endOfTables = 1 THEN
  34. LEAVE tablesLoop;
  35. END IF;
  36. 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');
  37. PREPARE stmt FROM @s;
  38. EXECUTE stmt;
  39. END LOOP;
  40. CLOSE cur;
  41. 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;
  42. END
ufj5ltwl

ufj5ltwl1#

这应该管用

  1. DELIMITER //
  2. DROP PROCEDURE IF EXISTS getallarbeitsplaene //
  3. CREATE PROCEDURE getallarbeitsplaene()
  4. BEGIN
  5. DECLARE tableName VARCHAR(64);
  6. DECLARE endOfTables INT DEFAULT 0;
  7. DECLARE cur CURSOR FOR
  8. SELECT t.table_name
  9. FROM information_schema.tables t
  10. WHERE t.table_schema = DATABASE()
  11. AND t.table_type='BASE TABLE'
  12. AND NOT table_name LIKE '%x_arbeitsplan'
  13. AND table_name LIKE '%_arbeitsplan';
  14. DECLARE CONTINUE HANDLER FOR NOT FOUND SET endOfTables = 1;
  15. DROP TEMPORARY TABLE IF EXISTS alle_plaene;
  16. CREATE TEMPORARY TABLE alle_plaene (
  17. `ID` INT(11) NOT NULL,
  18. `AP` VARCHAR(8) NOT NULL,
  19. `Name` VARCHAR(128) NOT NULL,
  20. `Baugruppentyp` VARCHAR(128) NOT NULL,
  21. `Basiseinheit` VARCHAR(8) NOT NULL,
  22. `Zeit_Basiseinheit` NUMERIC(10,0) NOT NULL,
  23. `vor_OF` BINARY(1) NOT NULL,
  24. `zwischen_OF` BINARY(1) NOT NULL,
  25. `nach_OF` BINARY(1) NOT NULL,
  26. `Annahme_Grundlage` VARCHAR(64) NOT NULL,
  27. `Budget_AG_Bankraum` VARCHAR(7) NOT NULL,
  28. `Budget_AG_FU` VARCHAR(7) NOT NULL,
  29. `Datum_voraus` DATE,
  30. `Budget_voraus` INT(11) NOT NULL,
  31. `tableName` VARCHAR(64) NOT NULL
  32. ) ENGINE=MEMORY;
  33. OPEN cur;
  34. tablesLoop: LOOP
  35. FETCH cur INTO tableName;
  36. IF endOfTables = 1 THEN
  37. LEAVE tablesLoop;
  38. END IF;
  39. 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');
  40. PREPARE stmt FROM @s;
  41. EXECUTE stmt;
  42. DEALLOCATE PREPARE stmt;
  43. END LOOP;
  44. CLOSE cur;
  45. SELECT * FROM alle_plaene;
  46. END //
  47. DELIMITER ;
  48. call getallarbeitsplaene();

这个解决方案只在几个地方与您的版本不同,但这里有一些要点供您考虑
information\u schema.table\u name是varchar(64)。
你的代码中没有使用任何一个输入参数,所以我删除了它们。
您应该将表名称添加到临时表中,并在@s=concat(…)语句中用带引号的字符串填充该列。
这个 ID 以及 AP 列需要在temp表中填充或完全删除,因为它们不能为null,所以它们必须获得一个值。
我不禁要问,为什么每天都要创建多个相同的表,只是为了将输出合并到一个临时表中进行查询,单表解决方案当然更好。

展开查看全部

相关问题