MySQL动态表问题

时间:2012-10-23 21:21:32

标签: mysql sql

我们每个月都会收到一个包含300多列的CSV文件。文件的布局可以随时更改,并且可以添加/删除列。我需要一种方法来创建一个包含所需列数的动态表。我不关心列名,它们可以是Column1,Column2等。我计划将所有类型设置为Varchar(500)。

理想情况下,我想要完成的是一个存储过程,我可以简单地传递所需的列数,然后循环创建必要的表定义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;

我喜欢接近这一点,但我真正需要的是能够创建一个包含任意列数的表格。

谢谢!

1 个答案:

答案 0 :(得分: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, ')');
...

在这种情况下,在姓氏之后添加逗号,然后结果字符串中的所有逗号都会被替换,就像前面的示例一样。作为对列表的最后触摸,删除尾随逗号,最后构建完整语句。

无论哪种方式,都不需要循环。