前1阵子在实行中发现问题,需要当时进行修改,而由于数据库中数据是真实数据,不能进行修改,否则会出大纰漏吧,因而添加测试数据来方便修改,而单个添加效力太低下了,所以解决的办法就是以真实的数据为模板增加新方便删除的数据便可,就像将2014年的数据复制1份只将年份进行修改,删除的时候讲这个不存在的年份数据删除便可。
相信大家很容易会想到这个方法,也很容易做出答案,举个例子:
看这个表,由于主键中都是以当年年份开头的,同时年度也是当年年份,这样我们就能够进行添加修改:
假使说这个表格存在以下列:
btfid、production、code、retrieveid、location、tobaccostation、plantvillage、cooperation、tobaccotechnician、eastlong、eastlat、southlong、southlat、westlong、westlat、northlong、northlat、amsl、totalarea
那样我们可以可以这样写:
insert into
arc_basictobaccofield
select '2016' || substr(btfid, 5),
'2016',
code,
retrieveid,
location,
tobaccostation,
plantvillage,
cooperation,
tobaccotechnician,
eastlong,
eastlat,
southlong,
southlat,
westlong,
westlat,
northlong,
northlat,
amsl,
totalarea
from arc_basictobaccofield
where tobaccostation = '37030405C'
and productionyear = 2015
然后在删除的时候只需要将年份为2016的全部删除便可,但是这里还存在1个问题,实际上表的属性可能不单单只有这么点列,事实上,就算只有这几列,也远远大于我们需要修改的两列数据了,我们是否是可以有更好的办法来解决它呢?
答案是肯定的,这样我们倒过来思考下,我们只需要修改两列而已,那我们就把所有数据取出来,将这两列数据修改以后进行插入不就能够了么,我们来写下看:
首先我们来创建1个临时表:
create table arc_basictobaccofield1 as
select * from arc_basictobaccofield where tobaccostation='37030405C' and productionyear=2015
然后我们将需要修改的列进行修改:
update arc_basictobaccofield1 set productionyear=2015
update arc_basictobaccofield1 set btfid ='2015'||substr(btfid,5)
这时候候将修改后的数据导入我们需要导入的表中:
insert into arc_basictobaccofield select * from arc_basictobaccofield1
最后这1步还是很关键的,千万不能忘掉:检查导入数据,然后删除临时表
drop table arc_basictobaccofield1
这样再来看,是否是不需要估计真实表究竟有多少列了呢,可见许多时候换个思考方式还是很有效力的