日期:2014-05-16  浏览次数:20800 次

Mysql中,判断表是否存在。
由于数据量过大,不同数据按月或按天存放,每月或每天自动生成数据表。
但是用户查询时间可能过长,所以,需要判断用户查询时间段内,表是否存在。

我想在整个SQL语句执行过程中,用while循环来检测表是否存在,这样比使用应用程序快些。之前在MSSQL上一直这么做,现在数据移植到MySQL上,使用while循环来做,总是不正确。

简单的说,我就是想在MySQL的SQL语句中(非函数、存储过程中)使用while循环,然后使用prepare 和 execute 执行动态的SQL语句。

求大侠帮助。

------解决方案--------------------
代码是什么,什么版本?5.1以上,可以用系统表
------解决方案--------------------
简单的说,我就是想在MySQL的SQL语句中(非函数、存储过程中)使用while循环,然后使用prepare 和 execute 执行动态的SQL语句

在MYSQL里,WHILE只能放到代码块里。让你失望了。
------解决方案--------------------
SQL code

DROP PROCEDURE IF EXISTS mydb.Clear_DB;
CREATE PROCEDURE mydb.`Clear_DB`( 
  )
BEGIN
  DECLARE done INT DEFAULT 0; #游标的标志位
  DECLARE a varchar(20);
  DECLARE b varchar(20);
  DECLARE cur1 CURSOR FOR SELECT table_name FROM information_schema.TABLES WHERE table_name like 'http_200909%' ;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
 
  OPEN cur1;
  REPEAT
    FETCH cur1 INTO a;
    IF NOT done THEN 
       set b=concat(b,'select *  from ',a,' where name=http://scholar.google.com.hk union all'); # 拼 命令  
    END IF;
    
  UNTIL done END REPEAT;
  CLOSE cur1;
  SET @E=mid(b,1,length(b)-9);   # 去掉最后一个UNION ALL
       PREPARE stmt1 FROM @E; 
          EXECUTE stmt1; # 执行命令 
          DEALLOCATE PREPARE stmt1; #释放对象
END;

------解决方案--------------------
SELECT table_name FROM information_schema.TABLES WHERE table_name ='yourname';

这个命令才是重点。
------解决方案--------------------
zuoxingyu这个存储过程用的刚刚的
------解决方案--------------------
学习````````
------解决方案--------------------
MYSQL中无解。它不支持这种SQL语句。你的需求只能按四楼 zuoxingyu(差400分上北大) 的方法在存储过程中实现。

但在MYSQL中类似的情况应该是用分区表来实现,而不是实质上的分表。
------解决方案--------------------
MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html

MySQL 5.1参考手册第18章:分区
目录

18.1. MySQL中的分区概述
18.2. 分区类型
18.2.1. RANGE分区
18.2.2. LIST分区
18.2.3. HASH分区
18.2.4. KEY分区
18.2.5. 子分区
18.2.6. MySQL分区处理NULL值的方式
18.3. 分区管理
18.3.1. RANGE和LIST分区的管理
18.3.2. HASH和KEY分区的管理
18.3.3. 分区维护
18.3.4. 获取关于分区的信息
本章讨论MySQL 5.1.中实现的分区。关于分区和分区概念的介绍可以在18.1节,“MySQL中的分区概述”中找到。MySQL 5.1 支持哪几种类型的分区,在18.2节,“分区类型” 中讨论。关于子分区在18.2.5节,“子分区” 中讨论。现有分区表中分区的增加、删除和修改的方法在18.3节,“分区管理” 中介绍。 和分区表一同使用的表维护命令在18.3.3节,“分区维护” 中介绍。

请注意:MySQL 5.1中的分区实现仍然很新(pre-alpha品质),此时还不是可生产的(not production-ready)。 同样,许多也适用于本章:在这里描述的一些功能还没有实际上实现(分区维护和重新分区命令),其他的可能还没有完全如所描述的那样实现(例如, 用于分区的数据目录(DATA DIRECTORY)和索引目录(INDEX DIRECTORY)选项受到Bug #13520) 不利的影响). 我们已经设法在本章中标出这些差异。在提出缺陷报告前,我们鼓励参考下面的一些资源:

MySQL 分区论坛

这是一个为对MySQL分区技术感兴趣或用MySQL分区技术做试验提供的官方讨论论坛。来自MySQL 的开发者和其他的人,会在上面发表和更新有关的材料。它由分区开发和文献团队的成员负责监控。

分区缺陷报告

已经归档在缺陷系统中的、所有分区缺陷的一个列表,而无论这些缺陷的年限、严重性或当前的状态如何。根据许多规则可以对这些缺陷进行筛选,或者可以从MySQL缺陷系统主页开始,然后查找你特别感兴趣的缺陷。

Mikael Ronström's Blog

MySQL分区体系结构和领先的开发者Mikael Ronström 经常在这里贴关于他研究MySQL 分区和MySQL簇的文章。

PlanetMySQL

一个MySQL 新闻网站,它以汇集MySQL相关的网誌为特点,那些使用我的MySQL的人应该对此有兴趣。我们鼓励查看那些研究MySQL分区的人的网誌链接,或者把你自己的网誌加到这些新闻报道中。

MySQL 5.1的二进制版本目前还不可用;但是,可以从BitKeeper知识库中获得源码。要激活分区,需要使用--with-分区选项编译服务器。关于建立MySQL 的更多信息,请参见2.8节,“使用源码分发版安装MySQL”。如果在编译一个激活分区的MySQL 5.1创建中碰到问题,可以在MySQL分区论坛中查找解决办法,如果在论坛中已经贴出的文章中没有找到问题的解决办法,可以在上面寻找帮助。

18.1. MySQL中的分区概述
本节提供了关于MySQL 5.1.分区在概念上的概述。

SQL标准在数据存储的物理方面没有提供太多的指南。SQL语言的使用独立于它所使用的任何数据结构或图表、表、行或列下的介质。但是,大部分高级数据库管理系统已经开发了一些根据文件系统、硬件或者这两者来确定将要用于存储特定数据块物理位置的方法。在MySQL中,InnoDB存储引擎长期支持表空间的概念,并且MySQL服务器甚至在分区引入之前,就能配置为存储不同的数据库使用不同的物理路径(关于如何配置的解释,请参见7.6.1节,“使用符号链接”)。