人力系统在V2.0.14版本时,有一张表叫demo_user,这张表有两个字段id和name,在我们进行V2.0.16版本的开发时,用户提出了要有cn_name(中文名)信息,并且这个信息不允许为空,如果为空,则必须用“无中文名”显示。这是个很简单的需求,我们只需要在demo_user表中添加一个cn_name字段即可------alter table demo_user add cn_name varchar2(64) not null; 这个看似没有错误的语句,实际上是行不通的-----因为现场的这张表是有数据的,我们执行这条语句时会报下图所示的错误。 有经验的程序员可能想到了解决方法------将本来一条可以搞定的SQL分成三条,分别为: alter table demo_user add cn_name varchar2(64) null; update demo_user set cn_name = '无中文名'; alter table demo_user modify cn_name varchar2(64) not null;
再设想,在V2.0.16版本时,日本有家公司要用我们公司的人力系统,我们的数据库如何直接从无到V2.0.16版本? 很容易想到的一个方法是利用递归法,从第一个版本的脚本开始跑,一直跑到V2.0.16J。如果我们中间经历了1000个版本,那就跑1000遍吧J。实施的要哭了!面对重复性劳动时,人们都会抽象出一种比较好的方法来处理,就像设计模式中的状态模式代替无穷的if else语句一样,我们用各版本的全量脚本来代替增量脚本。这话不太好懂,以上面场景的demo_user表为例来说明一下吧。 以增量脚本的形式,我们会有三条SQL: alter table demo_user add cn_name varchar2(64) null; update demo_user set cn_name = '无中文名'; alter table demo_user modify cn_name varchar2(64) not null; 但以全量脚本的形式,我们只有一条SQL: create table demo_user ( ID VARCHAR2(18) not null, NAME VARCHAR2(60) not null, CN_NAME VARCHAR2(64) not null ); 看到上面的全量和增量,有何感想?是不是觉得全量脚本只能用于新增局点,而已有局点,只能用增量脚本?是的,全量脚本就是给新增局点用的,但是目前,我觉得我们还不需要提供全量脚本------原因是,维护全量脚本给我们带来的实惠要远远少于我们的付出。