免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1145 | 回复: 0
打印 上一主题 下一主题

MySQL动态表解决办法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-30 20:30 |只看该作者 |倒序浏览
由于CRM需要定期将数据导回到公司CRM数据库(目的DB:Oracle;源DB:MySQL);由于目前增长量不太大,,,而今后会比较大.由于MySQL数据库不是我建的,,,还是决定登上去看一下,主表没有一个字段可以唯一标识一比记录的,也就是说我目前只会面临.我导数据的同时有新的数据录入,明显会出问题.程序员又不在,,,之前一直都只管Oracle,马上要让玩MySQL,看来只得现学现用了,现写一个MySQL的存储过程来实现.让系统每天产生后一天的表放在那里,系统根据时间的不同,将数据插入不同的表中,以下为实施脚本:
MySQL存储过程事例:
declare @t_date varchar(20);
set @t_date = '(select concat('readinfo',curdate()+0))';
mysql>delimiter &&//临时结束符
mysql>create procedure p()
    ->begin
    ->select * from pet;
    ->end;&&
mysql>delimiter ;
mysql> call p();
自写MySQL存储过程:
CREATE TABLE readinfo20070726 (
  eid int(11) ,
  guid varchar(36) ,
  ip varchar(20) ,
  date varchar(20),
  bookname varchar(60) ,
  version int(11) ,
  isvip int(11) ,
  vipname varchar(80)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
CREATE TABLE readinfo20070727 (
  eid int(11) ,
  guid varchar(36) ,
  ip varchar(20) ,
  date varchar(20),
  bookname varchar(60) ,
  version int(11) ,
  isvip int(11) ,
  vipname varchar(80)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
CREATE TABLE readinfo20070728 (
  eid int(11) ,
  guid varchar(36) ,
  ip varchar(20) ,
  date varchar(20),
  bookname varchar(60) ,
  version int(11) ,
  isvip int(11) ,
  vipname varchar(80)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
存储过程:
CREATE PROCEDURE sp_readinfo(in eid int,in guid varchar(36),in ip varchar(50))
    NOT DETERMINISTIC
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
set @table =  concat('readinfo',curdate()+0);
set @temp1 = 'insert into ';
set @temp2 = '(eid,guid,ip,date) values(';
set @value1 = eid;
set @value2 = guid;
set @value3 = ip;
set @value4 = 'now())';
set @sql_text:=concat(@temp1,@table,@temp2,@value1,',',@value2,',',@value3,',',@value4);
prepare stmt from @sql_text;
execute stmt;
end;
这么做,,,对性能肯定会有影响,也只是暂时的,,,
附:
MYSQL存储过程使用动态SQL 建多表
例一:循环建立字段相同滴多表 表名如: k1k k2k k3k ........
mysql> delimiter //
mysql> create procedure ppp (in i int)
    -> begin
    -> declare k int;
    -> set k=1;
    -> while k set @t=k;
    -> set @tname=concat('k',@t,'k');
    -> set @dwhe='(id int,name varchar(255))';
    -> set @sql_text:=concat('create table ',@tname,@dwhe);
    -> prepare stmt from @sql_text;
    -> execute stmt;
    -> set k=k+1;
    -> end while;
    -> end;
    -> //
Query OK, 0 rows affected (0.00 sec)
mysql> call ppp(6)//
Query OK, 0 rows affected (0.86 sec)
例二:参数做为表名 查询
mysql> create procedure pp (tname varchar(255))
    -> begin
    -> set @na=tname;
    -> set @sql_text:='select count(*) from ';
    -> set @sql_text:=concat(@sql_text,@na);
    -> prepare stmt from @sql_text;
    -> execute stmt;
    -> end;



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/26381/showart_350320.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP