0

我正在对 MySQL 数据库进行逆向工程,我想从每个表的每一列中获取示例值列表。我想运行这样的查询:

select
  table_name,
  column_name,
  group_concat(
    (select distinct table_name.column_name limit 100)
    separator ','
  ) as examples
from
  information_schema.columns
where
  table_schema = 'myschema'
;

我希望输出看起来像这样:

table1 column1 (123,124,234)
table1 column2 ('Joe','Sara','Bob')

MySQL 不会接受 table_name.column_name 作为有效语法。编写此查询的正确方法是什么?

4

2 回答 2

0

根据 rene 的建议,我编写了一个存储过程,它输出每个表中每一列的值示例。它又丑又慢,但它确实有效。我欢迎有关如何改进此代码的建议。

DELIMITER // 
CREATE PROCEDURE column_example_values(
    IN db_name VARCHAR(64), 
    IN tbl VARCHAR(64), 
    IN col VARCHAR(64), 
    OUT result MEDIUMTEXT)
BEGIN
    SET @s = CONCAT('SELECT GROUP_CONCAT(tbl1.',col,
                    ' separator \',\') FROM (SELECT DISTINCT ',
                    col,' FROM ',db_name,'.',tbl,
                    ' LIMIT 100) tbl1 INTO @result1');
    PREPARE stmt FROM @s;
    EXECUTE stmt;
    SET result = IFNULL(@result1,'');
END;
//
DELIMITER ;

DELIMITER // 
CREATE PROCEDURE all_columns_example_values(IN db_name VARCHAR(64))
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE tbl, col VARCHAR(64);

  DECLARE cur1 CURSOR FOR 
    SELECT 
      table_name,
      column_name 
    FROM 
      information_schema.columns 
    WHERE 
      table_schema = db_name 
    ORDER BY 
      table_name, 
      column_name;

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  CREATE TEMPORARY TABLE results (
    tbl VARCHAR(64), col VARCHAR(64), examples MEDIUMTEXT);

  OPEN cur1;

  read_loop: LOOP
    FETCH cur1 INTO tbl, col;
    IF done THEN
      LEAVE read_loop;
    END IF;
    CALL column_example_values(db_name,tbl,col,@result);
    INSERT INTO results (tbl, col, examples) VALUES (tbl, col, @result);
  END LOOP;

  CLOSE cur1;

  SELECT * FROM results;
  DROP TABLE results;
END;
//
DELIMITER ;

它可以被调用

CALL all_columns_example_values('mydb');
于 2013-06-01T15:13:19.340 回答
0

我认为 Sam,您正在寻找类似的东西,或者至少它会是一个更好的方法:

select
  table_name,
  column_name,
  group_concat((column_name) separator ',') as examples
from
  information_schema.columns
where
  table_schema = 'test'
GROUP BY table_name
;
于 2013-06-01T08:56:48.200 回答