bitsCN.com
mysql数据库动态创建表 大家一般可能很少有这种需求吧,我以前也没有遇到过,但这次做项目需要这么做。 就是表的字段名和字段数都不是固定的,要根据需要来创建。 这是我的创建形成过程,大家照着演示一下就知道了我的动态表的来龙去脉了。 第一步.创建相关表 /*---建立所有指标信息的临时表---*/ drop table if exists INTERBANKBONDQUOTE_SClass; create table INTERBANKBONDQUOTE_SClass ( Name varchar(50) not null, id int Primary key, Parent int, Value varchar(50) ); insert into INTERBANKBONDQUOTE_SClass(Name,id,Value)values(&#39;最新成交&#39;, 0,&#39;&#39;); insert into INTERBANKBONDQUOTE_SClass(Name,id,Value)values(&#39;买入信息&#39;, 1,&#39;&#39;); insert into INTERBANKBONDQUOTE_SClass(Name,id,Value)values(&#39;买卖价差&#39;, 2,&#39;&#39;); insert into INTERBANKBONDQUOTE_SClass(Name,id,Value)values(&#39;卖出信息&#39;, 3,&#39;&#39;); insert into INTERBANKBONDQUOTE_SClass(Name,id,Parent,Value)values(&#39;中债最新估值&#39;, 4, -1,&#39;&#39;); insert into INTERBANKBONDQUOTE_SClass(Name,id,Value)values(&#39;含权债行权指标&#39;, 5,&#39;&#39;); insert into INTERBANKBONDQUOTE_SClass(Name,id,Value)values(&#39;基础指标&#39;, 6,&#39;&#39;); insert into INTERBANKBONDQUOTE_SClass(Name,id,Value)values(&#39;双边报价笔数&#39;, 7,&#39;&#39;); insert into INTERBANKBONDQUOTE_SClass(Name,id,Parent,Value)values(&#39;报价方&#39;, 8, 1, &#39;col4&#39;); insert into INTERBANKBONDQUOTE_SClass(Name,id,Parent,Value)values(&#39;报价方会员号&#39;, 9, 1, &#39;col5&#39;); insert into INTERBANKBONDQUOTE_SClass(Name,id,Parent,Value)values(&#39;报价时间&#39;, 10, 1, &#39;col6&#39;); insert into INTERBANKBONDQUOTE_SClass(Name,id,Parent,Value)values(&#39;匿名&#39;, 11, 1, &#39;col7&#39;); 第二步:/*---建立显示数据表格标题的表---*/ drop table if exists INTERBANKBONDQUOTE_T; create table INTERBANKBONDQUOTE_T as select concat(&#39;/&#39;&#39;,a.Name,&#39;,&#39;,b.Name,&#39;/&#39; __TITLE__&#39;,b.Value); 第三步: 这里有两种实现方法。因为在mysql中,这时的变量长度受到了限制 ,本来应该longtext足够长的,可实际只返回了限制长度的。如果字段太多了,就要用第二种方法。 存储过程A: 这里变量返回值长度受限,字段不多时可以。 DELIMITER $$ DROP PROCEDURE IF EXISTS `dzhappdb_bond`.`INTERBANKBONDQUOTE_TSP`$$ CREATE PROCEDURE INTERBANKBONDQUOTE_TSP () BEGIN DECLARE objs1 TEXT; DECLARE objs TEXT; SELECT GROUP_CONCAT(col1) INTO objs1 FROM T; SET objs =CONCAT(&#39;CREATE TABLE Title AS SELECT &#39;,objs1); SET @sql_txt = objs; PREPARE stmt FROM @sql_txt; EXECUTE stmt; DEALLOCATE PREPARE stmt; END$$ call INTERBANKBONDQUOTE_TSP; 存储过程B:这样不管字段多少,只要数据库支持就可以创建成功。但不如第一个方法简洁。 DROP PROCEDURE IF EXISTS INTERBANKBONDQUOTE_TSP_Title; drop table if EXISTS Title; CREATE PROCEDURE INTERBANKBONDQUOTE_TSP_Title() proc:begin DECLARE add_sql LONGTEXT; DECLARE insert_sql LONGTEXT; DECLARE nhh_sql varchar(200); DECLARE column_name varchar(100); DECLARE column_value varchar(100); DECLARE mycount int; DECLARE len int; DECLARE strlen int; DECLARE cursor_Title CURSOR for select col1 from INTERBANKBONDQUOTE_T; create table Title(mid int); insert into Title values (100); select count(col1) into @mycount from INTERBANKBONDQUOTE_T; OPEN cursor_Title; REPEAT FETCH cursor_Title INTO nhh_sql; begin set @mycount=@mycount-1; set @strlen=CHARACTER_LENGTH(nhh_sql); set @len=INSTR(nhh_sql,&#39; &#39;); set @column_name=RIGHT(nhh_sql,@strlen-@len); set @column_value=LEFT(nhh_sql,@len); set @add_sql=CONCAT(&#39;ALTER table Title add COLUMN &#39;,@column_name,&#39; varchar(100)&#39;); set @insert_sql=CONCAT(&#39;update Title set &#39;,@column_name,&#39;=&#39;,@column_value,&#39; where mid=100&#39;); PREPARE stmt1 FROM @add_sql; EXECUTE stmt1; PREPARE stmt2 FROM @insert_sql; EXECUTE stmt2; DEALLOCATE PREPARE stmt1; DEALLOCATE PREPARE stmt2; end; until @mycount<=0 END REPEAT; CLOSE cursor_Title; ALTER table Title drop column mid; end proc; call INTERBANKBONDQUOTE_TSP_Title; bitsCN.com