0

10 列のうち特に重要な 3 列を含む完全に同一の MYSQL テーブルが数百あります。テーブル名は次のパターンに従います: 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

1 列目は各テーブルの完全な名前 ( 1 番目のテーブルはr_t 、2 番目はy_g )、2 列目 - アンダースコアの前のテーブル名の最初の部分 ( 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 だけで行う方法がわかりません。

アイデアをありがとう!

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() //

これにより、ユニオン ビューではなくテーブルが作成されるため、入力テーブルの変更は反映されないことに注意してください。このクエリを 1 回実行してから、元のテーブルを廃棄して、この新しいユニオン テーブルのビューに置き換えることをお勧めします。

于 2013-05-16T11:43:31.360 に答える