0

我有几百个完全相同的 MYSQL 表,其中包含 10 个中的 3 个特别重要的列。表名遵循以下模式:name1_name2:

Table 1 name: r_t

chr, chromStart, chromEnd...

Table 2 name: y_g

chr, chromStart, chromEnd...

有一个主表:

full_table_name, table_name_before_underscore, table_name_after_underscore

第一列由每个表的全名组成(r_t表示第一个表,y_g - 表示第二个),第二列 - 下划线之前的表名的第一部分(ry),3d - 下划线之后(tg )

我需要从每个表中获取带有 chr、chrStart、chromEnd 行的 UNION_all_table 以及由每个表名的第一部分(下划线之前)和第二部分(下划线之后)组成的 2 个附加列,以区分数据来自哪个表。对于上面的 2 个表:

Union_all_table:
chr, chrStart, chromEnd, table_name_before_underscore, table_name_after_underscore
1, 3456, 3487, r, t;
1, 3778, 3799, y, g;

准备好的语句不适用于 Alter 表、Update 表,所以我看不到仅通过 MYSQL 的方法。

非常感谢您的任何想法!

4

1 回答 1

0

“Prepared statement doesn't work for Alter table, Update table”是什么意思?以下对我有用

CREATE PROCEDURE proc()
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE a, b CHAR(1);
  DECLARE cur CURSOR FOR
    SELECT table_name_before_underscore,
           table_name_after_underscore
    FROM master;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
  OPEN CUR;
  read_loop: LOOP
    FETCH cur INTO a, b;
    IF done THEN
      LEAVE read_loop;
    END IF;
    SET @query = CONCAT('INSERT INTO Union_all_table SELECT ',
                        'chr, chromStart, chromEnd, \'',
                        a, '\', \'', b, '\' FROM ',
                        a, '_', b);
    PREPARE stmt FROM @query;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
  END LOOP;
  CLOSE cur;
END //

CALL proc() //

请注意,这确实创建了一个表,而不是联合视图,因此它不会反映您输入表中的任何修改。我建议您执行一次此查询,然后废弃您的原始表并用这个新联合表的视图替换它们。

于 2013-05-16T11:43:31.360 回答