重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
有两种方法,一种方法使用mysql的check table和repair table 的sql语句,另一种方法是使用MySQL提供的多个myisamchk, isamchk数据检测恢复工具。前者使用起来比较简便。推荐使用。
成都创新互联公司从2013年创立,先为恭城等服务建站,恭城等地企业,进行企业商务咨询服务。为恭城企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
1. check table 和 repair table
登陆mysql 终端:
mysql -uxxxxx -p dbname
check table tabTest;
如果出现的结果说Status是OK,则不用修复,如果有Error,可以用:
repair table tabTest;
进行修复,修复之后可以在用check table命令来进行检查。在新版本的phpMyAdmin里面也可以使用check/repair的功能。
2. myisamchk, isamchk
其中myisamchk适用于MYISAM类型的数据表,而isamchk适用于ISAM类型的数据表。这两条命令的主要参数相同,一般新的系统都使用MYISAM作为缺省的数据表类型,这里以myisamchk为例子进行说明。当发现某个数据表出现问题时可以使用:
myisamchk tablename.MYI
进行检测,如果需要修复的话,可以使用:
myisamchk -of tablename.MYI
关于myisamchk的详细参数说明,可以参见它的使用帮助。需要注意的时在进行修改时必须确保MySQL服务器没有访问这个数据表,保险的情况下是最好在进行检测时把MySQL服务器Shutdown掉。
从字面可以这么理解什么是游标,游标就像是水面上漂浮的一个标记,这个标记可以来回游动,一会游到这里一会游到那里,这里的河水可以理解为是数据的集合,这个标记就是在这些数据间来回游动。
为什么 MySQL 会有游标这个概念,由于 SQL 语言是面向集合的语句,它每次查询出来都是一堆数据的集合,没有办法对其中一条记录进行单独的处理。如果要对每条记录进行单独处理就需要游标。
游标其实就像是编程语言中的 for/foreach 循环,把一个数组(数据的集合)中每条数据一条一条地循环出来,然后你在 for/foreach 循环中使用判断语句对你感兴趣的数据进行处理。
哪里可以使用游标呢,函数,存储过程,触发器中都可以使用。
说完概念,就来看下游标的固定写法。不管概念是否理解,记住下面的固定模式也可以完成搬砖任务。
1、声明游标
SELECT 语句就是正常的查询语句,例如:SELECT id,age FROM table;
2、打开游标
在打开游标之前,游标定义的 SQL 语句是不执行的。
3、取出记录
将当前的记录数据存入变量。
当 FETCH 没有找到记录时会抛出异常,异常的定义需要下面的 HANDLER FOR 语句。
声明游标语句中的 SELECT 如果有多个字段,INTO 后面需要多个变量进行接收。
4、设置结束条件
这个语句的作用是指定一个条件,告诉程序所有数据已经循环完毕,可以结束了。由于游标是使用 WHILE 循环进行每条数据的读取,就需要给 WHILE 一个结束条件。
处理种类:可以是, EXIT 立即结束。CONTINUE 继续下面的处理。
异常的类型:一般指定为 NOT FOUND ,意思是没有找到任何数据。
异常发生时的处理:当异常发生时需要做的事情,这里一般改变一个变量的值来记录异常已经发生了,如如 SET flat = 1 详细用法查看下面的例子。
5、关闭游标
实战代码:
完毕,看懂没,如果没看懂没关系,游标处理是一套固定的格式,按照上面例子中固定的格式套入到你的程序就可以了。
下面是一个 MySQL 的 游标处理的 例子代码。 你参考参考看看。
mysql DELIMITER //
mysql CREATE PROCEDURE TestCursor()
- BEGIN
-
- DECLARE v_id INT;
- DECLARE v_value VARCHAR(10);
-
- -- 游标控制的标志
- DECLARE no_more_departments INT;
-
- -- 定义游标.
- DECLARE c_test_main CURSOR
- FOR
- SELECT id, value FROM test_main;
-
- -- 当游标没有数据的时候
- -- 设置 no_more_departments = 1
- DECLARE CONTINUE HANDLER
- FOR
- NOT FOUND SET no_more_departments=1;
-
- -- 设置初始标志位,认为游标是有数据的.
- SET no_more_departments=0;
-
- -- 打开游标
- OPEN c_test_main;
-
- -- 获取游标数据
- FETCH c_test_main INTO v_id, v_value;
-
- -- 循环所有的行
- WHILE no_more_departments = 0 DO
- -- 输出调试信息
- SELECT v_id, v_value;
-
- -- 获取游标数据
- FETCH c_test_main INTO v_id, v_value;
- END WHILE;
-
- -- 关闭游标
- CLOSE c_test_main;
- END//
Query OK, 0 rows affected (0.00 sec)