拆分数据库表字段,用拆分后的字段重新建表并删除关联表

#!/bin/bash
#author     xiaobao 
#date       2017-3-24 21:37:27
#此sql的原理是:
#1、创建t_prog_test表   
#2、将t_file_bak表中file_name字段值拆分为四部分,并将值分别插入到t_prog_test表的course_id、student_id、sub_id、extra
#3、若extra值不是bak,则置为空
#4、分别查询t_prog_test、t_file_distribution、t_file_info、t_file1_list、t_file2_list、t_course_info表是否正确
#5、将t_file_distribution、t_file_info、t_file1_list、t_file2_list、t_course_info表中course_id值为A的全部删除


#创建表
USE 'xiaobao_db';
DROP TABLE IF EXISTS `t_prog_test`;
CREATE TABLE `t_prog_test` (
  `course_id` varchar(64) NOT NULL,
  `student_id` varchar(64) NOT NULL,
  `sub_id` varchar(64) NOT NULL,
  `extra` varchar(64) DEFAULT NULL,
  `file_name` varchar(255) DEFAULT NULL,
  KEY `course_id` (`course_id`,`student_id`,`sub_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

#插入数据
insert into t_prog_test(course_id, student_id, sub_id, extra, file_name) 
select SUBSTRING_INDEX(file_name, '_', 1) as course_id,
SUBSTRING_INDEX(SUBSTRING_INDEX(file_name, '_', -2), '_', 1) as student_id, 
SUBSTRING_INDEX(SUBSTRING_INDEX(file_name, '_', -1), '.', 1) as sub_id,
SUBSTRING_INDEX(SUBSTRING_INDEX(file_name, '_', -1), '.', -1) as extra,
file_name
from `t_file_bak`; 

#更改extra值
update t_prog_test set extra='' where extra != 'bak';

#查询,检验表是否正确
select * from t_prog_test;

#关联查询
select t1.file_name from t_file_distribution t1
where t1.file_name in (select t2.file_name from t_prog_test t2 where t2.course_id = 'A');

select t1.file_name from t_file_info t1
where t1.file_name in (select t2.file_name from t_prog_test t2 where t2.course_id = 'A');

select t1.file_name from t_file1_list t1
where t1.file_name in (select t2.file_name from t_prog_test t2 where t2.course_id = 'A');

select t1.file_name from t_file2_list t1
where t1.file_name in (select t2.file_name from t_prog_test t2 where t2.course_id = 'A');

select t1.student_id from t_course_info t1
where t1.student_id in (select t2.student_id from t_prog_test t2 where t2.course_id = 'A');

#关联删除
delete from t_file_distribution 
where file_name in (select t2.file_name from t_prog_test t2 where t2.course_id = 'A');

delete from from t_file_info 
where file_name in (select t2.file_name from t_prog_test t2 where t2.course_id = 'A');

delete from from t_file1_list 
where file_name in (select t2.file_name from t_prog_test t2 where t2.course_id = 'A');

delete from from t_file2_list 
where file_name in (select t2.file_name from t_prog_test t2 where t2.course_id = 'A');

delete from from t_course_info 
where student_id in (select t2.student_id from t_prog_test t2 where t2.course_id = 'A');

写这篇文章是因为被这个问题折腾够呛,因为一些让人无语的原因导致磁盘上的文件部分丢失,需要重新将数据写入一遍数据库,在重新写入数据库之前需要将丢失的文件的数据记录删除。
由于还有大量其他文件的数据记录与丢失文件的数据记录在同一张表上,因此要将丢失文件的数据记录筛选出来然后再将数据记录删除。令人头痛的有两个问题,第一个问题是文件的数据记录不是只存在于一张表的,而是多张表,因此要关联删除才行;第二个问题是,要关联删除就必须有关联字段值,但是要删除记录的几张数据表并不是都有关联字段值,所以要找到一张包含其他表都有的字段值的数据表。然后对其字段值进行拆分,拆分以后重新建表,再用重新建立的表将要删除记录的几张数据表关联起来,最后进行关联删除。
在处理这个问题时候,真的是感到棘手,不过等处理完了再回来整理思路的时候,其实发现并没有那么复杂,主要是自己处理数据库问题方面的经验太少,不然当时也不会焦头烂额了!为了防止泄露工作内容,sql脚本是经过处理后通用版本了,有需要的童鞋,稍微进行一下修改就可以直接使用了。也欢迎大神留言吐槽

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值