接手一个成旧的项目进行二次开发,没有文档,什么都需要自己去查找,很是费时间。这次我接手一个java项目,但是只有数据库,源码我暂时又看不到,想删除测试数据,只有找他们(业务太复杂)。但是他们也删除不完全,无奈我只有慢慢的去数据库查看是哪个表哪个字段的查询,费时费力。
百度了mysql 的数据库全表查询,好像是没有找到现成的,只有自己动手了。
好了,废话不多说进入主题。
information_schema数据库有一个COLUMNS表,它存储所有表字段信息,我们通过通过查询表中数据库名,来获取该数据库下的所表结构信息。同时,还需要读者自己熟悉一下mysql 游标的操作。
BEGIN
DECLARE num int;
DECLARE tableName,columnName,searchSql VARCHAR(500);
DECLARE done INT DEFAULT FALSE; -- 自定义控制游标循环变量,默认false
DECLARE databaseName VARCHAR(500) DEFAULT 'test';
DECLARE rs CURSOR FOR SELECT TABLE_NAME,COLUMN_NAME FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA =databaseName;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;-- 绑定控制变量到游标,游标循环结束自动转true
/* 打开游标 */
OPEN rs;
/* 创建零时表 */
DROP TABLE IF EXISTS tmp;
CREATE TEMPORARY TABLE tmp(
tablname VARCHAR(500),
columnname varchar(500),
selectsql VARCHAR(500)
);
/* 逐个取出字段的值,需要进行最大值的判断 */
FETCH rs INTO tableName,columnName;
REPEAT
/* 遍历数据表 */
IF NOT done THEN
SET @searchSql=CONCAT('SELECT count(*) into @tmp_num FROM ','`',databaseName,'`','.',tableName,' WHERE ','`',columnName,'`',' LIKE ',' "%fff%" ');
PREPARE stm FROM @searchSql;
EXECUTE stm;
DEALLOCATE PREPARE stm;
SET num=@tmp_num;
IF num THEN
INSERT INTO tmp(tablname,columnname,selectsql) VALUES(tableName,columnname,@searchSql);
END IF;
END IF;
FETCH rs INTO tableName,columnName;
UNTIL done END REPEAT;
/* 关闭游标 */
CLOSE rs;
/* 查询到的数据 */
SELECT * FROM tmp;
END
给了大家一个思路,里面实现的有一些粗糙,请根据自己实际情况做相应的修改。