我是靠谱客的博主 含蓄纸飞机,最近开发中收集的这篇文章主要介绍sql函数 批量修改数据表——自定义表名前提第一步批量创建表第二步 筛选出需要的数据第三步 最终形态,利用数据表传递更多的参数,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
文章目录
- 前提
- 第一步批量创建表
- 根据给定表名创建表结构
- 第二步 筛选出需要的数据
- 第三步 最终形态,利用数据表传递更多的参数
- 1、先建传参的数据表
- 2、给变量传值
- 3、读取数据表中的类容
- 具体写法
本人也是初学者,本文可能存在很多漏洞欢迎指出;相信在各路大佬的帮助下,我才能学会更多。
前提
- 设计目的:1、给数据库释放空间;2、要将需要的数据单独保存出来
- 备注:由于delete删除数据并不能立即释放空间,truncat又不能跟筛选条件,drop删表又是万万不能的
- 设计思路:先将要保存的数据给保存到一张new表上面,将原来的old表删除,再将new数据表名改成old
第一步批量创建表
根据给定表名创建表结构
参考:sql 批量创建表
参考:将一个表的数据复制到另外一个表
CREATE TABLE table4 LIKE table1
提示:由于给定变量为字符串且是varchar类型,最大字节长度就是255,所以在给参数时一定要注意
后面会创建一个数据表来传参,以此来改善这个弊端
DELIMITER $$
DROP PROCEDURE IF EXISTS Only_one$$
CREATE PROCEDURE Only_one(tmp VARCHAR(255)) -- 要注意这里参数不能过长
BEGIN
DECLARE
i INT;
DECLARE
Start1 INT;
DECLARE
Length INT;
DECLARE
TotalLenght INT;
DECLARE
filed VARCHAR ( 100 );
DECLARE
mmm VARCHAR ( 100 );
DECLARE
sqlStr VARCHAR ( 2000 );
DECLARE
stmtNovelSearch VARCHAR ( 2000 ); -- 其实这里不用定义也不会报错
SET i = 1;
SET Start1 = 1;
SET Length = 0;
SET TotalLenght=length(tmp);
WHILE i<=TotalLenght DO
IF (SUBSTRING(tmp,i,1)=',')
THEN
SET filed = SUBSTRING( tmp, Start1, Length );-- 从start1开始截取length长度的字符
SET mmm=CONCAT(filed,"_old");
SET @sqlStr = CONCAT( 'CREATE TABLE ', mmm, ' SELECT * FROM ',filed,' LIMIT 5' );-- 拼装sql语句
PREPARE stmtNovelSearch
FROM
@sqlStr;-- prepare 预编译必须采用这种传参方式
EXECUTE stmtNovelSearch;
DEALLOCATE PREPARE stmtNovelSearch;
SET Start1 = i + 1;
SET Length = 0;
ELSE
SET Length = Length + 1;-- 如果不是, 则截取的长度加1
END IF;
SET i = i + 1;
END WHILE;
END $$
call Only_one('smbms_bill,smbms_role,smbms_user,smbms_address,smbms_provider,'); -- 用的逗号截取的表名,所以最后一定要加个逗号
DELIMITER ;
第二步 筛选出需要的数据
假如只要最近十天的数据
WHERE DATE_SUB(CURDATE(), INTERVAL 10 DAY) <= create_time
处于对生产数据的保护,我这里还是拷贝数据的方法
CREATE TABLE New_table SELECT * FROM Old_table LIMIT 5
具体sql
DELIMITER $$
DROP PROCEDURE IF EXISTS Only_one$$
CREATE PROCEDURE Only_one(tmp VARCHAR(255))
BEGIN
DECLARE
i INT;
DECLARE
Start1 INT;
DECLARE
Length INT;
DECLARE
TotalLenght INT;
DECLARE
filed VARCHAR ( 100 );
DECLARE
mmm VARCHAR ( 100 );
DECLARE
sqlStr VARCHAR ( 2000 );
DECLARE
sqlStr2 VARCHAR ( 2000 );
DECLARE
sqlStr3 VARCHAR ( 2000 );
DECLARE
stmtNovelSearch VARCHAR ( 2000 );
SET i = 1;
SET Start1 = 1;
SET Length = 0;
SET TotalLenght=length(tmp);
WHILE i<=TotalLenght DO
IF (SUBSTRING(tmp,i,1)=',')
THEN
SET filed = SUBSTRING( tmp, Start1, Length );-- 从start1开始截取length长度的字符
SET mmm=CONCAT(filed,"_old");
SET @sqlStr = CONCAT( 'CREATE TABLE ', mmm, ' SELECT * FROM ',filed,' LIMIT 5' );-- 截取要保存的数据
PREPARE stmtNovelSearch
FROM
@sqlStr;-- prepare 必须采用这种传参方式
EXECUTE stmtNovelSearch;
DEALLOCATE PREPARE stmtNovelSearch;
SET @sqlStr2 = CONCAT( 'DROP TABLE ', filed );-- 删除原来的表
PREPARE stm1
FROM
@sqlStr2;-- prepare 必须采用这种传参方式
EXECUTE stm1;
DEALLOCATE PREPARE stm1;
SET @sqlStr3 = CONCAT( 'ALTER TABLE ', mmm ,' RENAME TO ' ,filed );-- 修改数据表的名字
PREPARE stm2
FROM
@sqlStr3;-- prepare 必须采用这种传参方式
EXECUTE stm2;
DEALLOCATE PREPARE stm2;
SET Start1 = i + 1;
SET Length = 0;
ELSE
SET Length = Length + 1;-- 如果不是, 则截取的长度加1
END IF;
SET i = i + 1;
END WHILE;
END $$
call Only_one('smbms_bill,smbms_role,smbms_user,smbms_address,smbms_provider,');
DELIMITER ;
第三步 最终形态,利用数据表传递更多的参数
先要理解以下几个sql 的用法
1、先建传参的数据表
DROP TABLE IF EXISTS `one`;
CREATE TABLE `one` (
`ID` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`NAME` varchar(255)
)
将需要的参数放进去
2、给变量传值
参考:Mysql存储过程查询结果赋值到变量的方法
不知道处于什么原因我只能用方法三,前面两种总是要报错
select count(*) into @cnt1 from test_tbl;
select @cnt1;
3、读取数据表中的类容
select NAME into New_table from `one` LIMIT 从第几行读,1;
具体写法
DELIMITER $$
DROP PROCEDURE IF EXISTS Only_one$$
CREATE PROCEDURE Only_one()
BEGIN
DECLARE
i INT;
DECLARE
mmm VARCHAR ( 100 );
DECLARE
sqlStr VARCHAR ( 2000 );
DECLARE
sqlStr2 VARCHAR ( 2000 );
DECLARE
sqlStr3 VARCHAR ( 2000 );
SET i = 0;
select COUNT(*) into @num from `one` ; -- one数据表名
select @num;
WHILE i<@num DO
select NAME into @cnt from `one` LIMIT i,1; -- 从数据表中读取要修改的字段
select @cnt;
SET mmm=CONCAT(@cnt,"_old");
SET @sqlStr = CONCAT( 'CREATE TABLE ', mmm, ' SELECT * FROM ',@cnt,' WHERE DATE_SUB(CURDATE(), INTERVAL 10 DAY) <= create_time' );-- 拼装sql语句
PREPARE stmtNovelSearch
FROM
@sqlStr;-- prepare 必须采用这种传参方式
EXECUTE stmtNovelSearch;
DEALLOCATE PREPARE stmtNovelSearch;
SET @sqlStr2 = CONCAT( 'DROP TABLE ', @cnt );-- 拼装sql语句
PREPARE stm1
FROM
@sqlStr2;-- prepare 必须采用这种传参方式
EXECUTE stm1;
DEALLOCATE PREPARE stm1;
SET @sqlStr3 = CONCAT( 'ALTER TABLE ', mmm ,' RENAME TO ' ,@cnt );-- 拼装sql语句
PREPARE stm2
FROM
@sqlStr3;-- prepare 必须采用这种传参方式
EXECUTE stm2;
DEALLOCATE PREPARE stm2;
SET i = i + 1;
END WHILE;
END $$
call Only_one();
DELIMITER ;
说实话这个sql折磨我已久,希望能够帮大家
最后
以上就是含蓄纸飞机为你收集整理的sql函数 批量修改数据表——自定义表名前提第一步批量创建表第二步 筛选出需要的数据第三步 最终形态,利用数据表传递更多的参数的全部内容,希望文章能够帮你解决sql函数 批量修改数据表——自定义表名前提第一步批量创建表第二步 筛选出需要的数据第三步 最终形态,利用数据表传递更多的参数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复