2013-06-01 15 views
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作爲有效的語法。什麼是寫這個查詢的正確方法?

+1

被稱爲是[這](http://stackoverflow.com/questions/190776/how-to-have-dynamic-sql-in-mysql-stored - 過程)相關? – rene

+0

這是相關的,但不清楚如何使用準備好的語句來執行此查詢。 MySQL要求參數值是用戶變量,所以它看起來像一個解決方案將不得不使用準備好的語句,該語句循環來自information_schema.columns表的結果。 – Sam

回答

0

我認爲薩姆,你正在尋找類似的東西,或者至少這將是一個更好的辦法:

select 
    table_name, 
    column_name, 
    group_concat((column_name) separator ',') as examples 
from 
    information_schema.columns 
where 
    table_schema = 'test' 
GROUP BY table_name 
; 
+0

我不想列出每個表上的列,我試圖從每列中獲取示例值列表。在結果集中,我想要像「table1 column1(123,124,234)」「table1 column2('Joe','Sara','Bob')」這樣的行。 – Sam

0

根據劉若英的建議下,我寫了一個存儲過程,輸出數值的例子,從各列在每個表中。這是醜陋而緩慢的,但它的工作原理。我很歡迎有關如何改進此代碼的建議。

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