【问题标题】:How to get example values from every column in a schema如何从模式中的每一列获取示例值
【发布时间】:2013-06-01 23:13:19
【问题描述】:

我正在对 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 作为有效语法。编写此查询的正确方法是什么?

【问题讨论】:

  • this 相关吗?
  • 这是相关的,但是如何使用准备好的语句来执行此查询并不明显。 MySQL 要求参数值是用户变量,因此似乎一个解决方案必须使用准备好的语句来循环来自 information_schema.columns 表的结果。

标签: mysql sql database schema reverse-engineering


【解决方案1】:

我认为 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
;

【讨论】:

  • 我不是要列出每个表上的列,而是要从每列中获取示例值列表。在结果集中,我想要像“table1 column1 (123,124,234)”“table1 column2 ('Joe','Sara','Bob')”这样的行。
【解决方案2】:

根据 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');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多