2012-10-23 79 views
1

每個月我們都會得到一個包含300列以上的CSV文件。該文件的佈局可以隨時更改,並且可以添加/刪除列。我需要一種創建包含所需列數的動態表的方法。我不關心列名稱,他們可以是Column1,Column2等。我打算將所有類型設置爲Varchar(500)。MySQL動態表問題

理想情況下,我想要完成的是一個存儲過程,我只需傳遞所需的列數,它將循環創建必要的表定義sql,然後執行該sql。

這樣做甚至可能嗎?我已經開始寫:

BEGIN 
Declare loopvar int default 1; 
Declare tsql VarChar(5000); 
Declare table_definition VarChar(8000); 
Declare tablename varchar(20); 
Set table_definition = 'Column'; 
set tablename = 'npi_data'; 
Set loopvar = 1; 
While loopVar < 362 DO 
    set tsql = table_definition + loopvar + 'varchar(500) DEFAULT NULL' ; 
    set loopvar = loopvar + 1; 
end while; 
set tsql = 'CREATE TABLE' + tablename + '(' + tsql + ') ENGINE=InnoDB DEFAULT CHARSET=utf8'; 
execute tsql; 
END; 

我想的東西接近,但我真正需要的是創建一個表列的任何給定數量的能力。

謝謝!

+0

讓你的列名爲Column1和Column2是一個不好的做法。爲什麼不使用'@tableColumns VARCHAR(8000)'參數,其中每個列名都會被逗號分隔? –

回答

0

如果您的意思是您希望能夠傳遞列名稱列表(如'A,B,C'),並使用它來生成列定義列表,如A varchar(500) DEFAULT NULL,B varchar(500) DEFAULT NULL,C varchar(500) DEFAULT NULL以及最終包含具有該定義列表的CREATE TABLE語句,那麼您可以使用這樣的方法:

... 
SET columnnames = 'A,B,C'; 
SET sql = CONCAT(
    REPLACE(columnnames, ',', ' varchar(500) DEFAULT NULL,'), 
    ' varchar(500) DEFAULT NULL' 
); 
SET sql = CONCAT('CREATE TABLE ', tablename, ' (', sql, ')'); 
... 

也就是說,在名稱列表中的每個逗號擴張,從而完成了逗號前的列的定義。由於最後一個項目後面沒有逗號,因此將該類型簡單地再次連接到REPLACE的結果。

另外,爲了避免varchar(500) DEFAULT NULL位的重複,你可以這樣做:

... 
SET columnnames = 'A,B,C'; 
SET sql = REPLACE(CONCAT(columnnames, ','), ',', ' varchar(500) DEFAULT NULL,'); 
SET sql = LEFT(sql, LENGTH(sql) - 1); 
SET sql = CONCAT('CREATE TABLE ', tablename, ' (', sql, ')'); 
... 

在這種情況下,一個逗號姓氏後添加,然後所有逗號得到的字符串中的換成像前面的例子一樣。作爲列表的最後一步,尾部的逗號將被刪除,最後會生成完整的語句。

無論哪種方式,都不需要循環。

+0

列數是動態部分,所以我確實需要一個循環遍歷任何可能數量的列,爲每個列創建一個定義。我無法通過列名稱列表,並且我沒有時間打開文件並每週輸出300多列名稱。 – Encryption