哎 ! 有先数据是手动插入的,爬虫爬取来的数据中亦可能存在异常数据
这个文章,利用存储过程,用来遍历表字段, 然后利用trim函数去除数据中的空格
目录
知识储备:
1. mysql 查询表字段信息
SELECT
COLUMN_NAME "字段名称",
COLUMN_TYPE "字段类型长度",
IF(EXTRA="auto_increment",CONCAT(COLUMN_KEY,"(", IF(EXTRA="auto_increment","自增长",EXTRA),")"),COLUMN_KEY) "主外键",
IS_NULLABLE "空标识",
COLUMN_COMMENT "字段说明"
FROM
information_schema. COLUMNS
-- 数据库名:jn_power 表名 rpt_cap_hour_ammeter_201810
WHERE TABLE_SCHEMA = 'jn_power' AND TABLE_NAME = 'rpt_cap_hour_ammeter_201810';
2 .存储过程----》循环
介绍 LOOP 循环吧、这里要用到,,,其他还有俩种,,自行补充学习吧
DROP PROCEDURE IF EXISTS `pro13`;
DELIMITER $$
CREATE PROCEDURE `pro13`()
BEGIN
-- 定义变量
DECLARE v_i int unsigned DEFAULT 0;
LOOP_LABEL:LOOP -- 定义Loop循环 名字,开始,像不像go to用法,,哈哈哈
IF v_i = 3 THEN
SET v_i = v_i+1;
ITERATE LOOP_LABEL; -- 中断继续就是contiue 意思
END IF;
SELECT v_i;
SET v_i = v_i+1;
IF v_i >= 5 THEN
LEAVE LOOP_LABEL; -- break 的意思
END IF;
END LOOP; -- 结束循环
END $$
DELIMITER ;
CALL pro13();
3 . 存储过程----》游标
DELIMITER $$
USE `chy2019` $$
DROP PROCEDURE IF EXISTS `copy_order_data` $$
CREATE DEFINER = `root` @`%` PROCEDURE `copy_order_data` (IN p_source VARCHAR (100))
BEGIN
-- 需要定义接收游标数据的变量
DECLARE done BOOLEAN DEFAULT 0 ;
-- 自定义变量
DECLARE var_price DOUBLE DEFAULT NULL ;
DECLARE var_pay_time TIMESTAMP DEFAULT NULL ;
DECLARE var_product VARCHAR (100) DEFAULT NULL ;
DECLARE var_source VARCHAR (100) DEFAULT NULL ;
-- 声明游标 重要看这里 定义游标这里sql不是动态的,,
DECLARE cur CURSOR FOR
-- 作用于哪个语句
SELECT
price,
pay_time,
product,
source
FROM
cms_aw_order
WHERE source = p_source ;
-- 设置结束标志
-- 这条语句定义了一个 CONTINUE HANDLER,它是在条件出现时被执行的代码。这里,它指出当 SQLSTATE '02000'出现时,SET done=1 。SQLSTATE '02000'是一个未找到条件,当REPEAT由于没有更多的行供循环而不能继续时,出现这个条件
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1 ;
-- 打开游标
OPEN cur ;
-- 使用repeat循环语法
REPEAT
-- 批读取数据到指定变量上
FETCH cur INTO var_price,
var_pay_time,
var_product,
var_source ;
-- 进行逻辑操作
INSERT INTO cms_aw_order_copy (price, pay_time, product, source)
VALUES
(
var_price,
var_pay_time,
var_product,
var_source
) ;
-- 循环结束条件
UNTIL done
END REPEAT ;
-- 关闭游标
CLOSE cur ;
END $$
DELIMITER ;
4. 去空格方法
-
trim()去除左右空格
-
l trim()去除左空
-
rtrim() 去除有空
5.综合一下需要替换的是表名库名字
begin
declare var_name varchar(1024) default '';
DECLARE done int default 0;
DECLARE from_name VARCHAR(50);
DECLARE db_name VARCHAR(50);
DECLARE sql_appendix VARCHAR(500);
DECLARE sql_trim VARCHAR(500);
declare SQL_FOR_SELECT varchar(500); -- 定义预处理sql语句
-- ---------------------------------------------------------------
DECLARE cur CURSOR FOR
SELECT column_name FROM information_schema.COLUMNS WHERE table_name = 'check_itme' AND table_schema = 'test2';
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' set done= 1;
open cur;
posLoop:LOOP
FETCH cur INTO var_name;
IF done = 1 THEN
LEAVE posLoop ;
END IF ;
SELECT var_name;
set SQL_FOR_SELECT = CONCAT("UPDATE check_itme set ",var_name,"=","trim(",var_name,")"); -- 拼接查询sql语句
set @sql = SQL_FOR_SELECT;
PREPARE stmt FROM @sql; -- 预处理动态sql语句
EXECUTE stmt ; -- 执行sql语句
deallocate prepare stmt; -- 释放prepare
END LOOP posLoop ;
CLOSE cur ;
end