这两天帮朋友做一个关于地热数据处理的小软件再次用到了SQLite数据库,不过这次不是使用其缓存/内存数据库的功能,而是纯粹将其作为一个嵌入式文件数据库来使用的,其实对于数据量级相对比较小的系统而言,嵌入式数据库SQLite绝对是一个非常理想的选择。但是,话又说回来,毕竟是一个没有DBA的数据库系统,因此所能实现的功能相对就比较简单,这不,遇到了想在一张表中增加一列的功能时着实让我头疼了一个下午的时光。

我们都知道,数据库表中增加/删除一列用sql语句实现很简单:

alter   table  表名称   add   列名称   数据类型;                        //  数据库表中增加一列

alter   table   表名称  drop  column   列名称    数据类型;      //  数据库中删除一列

但是,对于SQLite数据库而言有两个问题:

(1) 可以增加一列,但是该列只能是表的最后一列。

(2)不能删除一列。

对于第一个问题,如果你不觉得不爽的话,也没什么关系,并不影响使用,但是对于第二条而言问题就很大了,不支持删除一列还是很麻烦的事情。还要,条条大路通帝都。通过创建临时表的方法,可以很好的解决这个问题。

其实,说简单点儿,如果想删除表A中的一列或者一行,我们首先通过SQL创建一个临时表,然后把表A中期望保留的数据存储到临时表中,然后把表A删除,再通过SQL的create语句创建表A,最后将临时表中的数据再复制回来,算是一种曲线解决问题的方法吧。^_^

还是举两个例子说明最简单明了。

例1:在表coordinate中增加一列自动增长的id列。

BEGINTRANSACTION;

CREATETEMPORARYTABLEptemp(provinceIDint, longitudedouble, latitudedouble);

INSERTINTOptempSELECTprovinceID,longitude, latitudeFROMcoordinate;

DROPTABLEcoordinate;

CREATETABLEprovincecoordinate(idINTEGERPRIMARYKEYAUTOINCREMENT, provinceIDint, longitudedouble, latitudedouble);

INSERTINTOprovincecoordinate(provinceID, longitude, latitude)SELECTprovinceID, longitude, latitudeFROMptemp;

DROPTABLEptemp;

COMMIT;

例2:在表china中增加一列自动增长的id列。

BEGINTRANSACTION;

CREATETEMPORARYTABLEptemp(longitudedouble, latitudedouble);

INSERTINTOptempSELECTlongitude, latitudeFROMchina;

DROPTABLEchina;

CREATETABLEchina(idINTEGERPRIMARYKEYAUTOINCREMENT, longitudedouble, latitudedouble);

INSERTINTOchina(longitude, latitude)SELECTlongitude, latitudeFROMptemp;

DROPTABLEptemp;

COMMIT;

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐