我有几百个绝对相同的MYSQL表,其中包含3个特别重要的10列。表名遵循以下模式:name1_name2:
Table 1 name: r_t
chr, chromStart, chromEnd...
Table 2 name: y_g
chr, chromStart, chromEnd...
有一个MasterTable:
full_table_name, table_name_before_underscore, table_name_after_underscore
第一列包含每个表的全名(第一个表的 r_t , y_g - 第二个),第二个列 - 第一个列的第一个部分表格下划线前的表格( r 和 y ),3d - 下划线后( t 和 g )
我需要从每个表中获取带有chr,chrStart,chromEnd行的UNION_all_table和来自每个表名的第1部分(下划线之前)和第2部分(下划线之后)的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实现它的方法。
非常感谢任何想法!
答案 0 :(得分:0)
“准备语句对Alter表,更新表不起作用”是什么意思?以下works for me:
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() //
请注意,这确实会创建一个表,而不是联合视图,因此它不会反映输入表中的任何修改。我建议您执行一次此查询,然后废弃原始表并将其替换为此新联合表的视图。