转载出处:
http://blog.csdn.net/qinpanke/article/details/8007851?_t_t_t=0.08654117933474481
这两天帮朋友做一个关于地热数据处理的小软件再次用到了SQLite数据库,不过这次不是使用其缓存/内存数据库的功能,而是纯粹将其作为一个嵌入式文件数据库来使用的,其实对于数据量级相对比较小的系统而言,嵌入式数据库SQLite绝对是一个非常理想的选择。但是,话又说回来,毕竟是一个没有DBA的数据库系统,因此所能实现的功能相对就比较简单,这不,遇到了想在一张表中增加一列的功能时着实让我头疼了一个下午的时光。
我们都知道,数据库表中增加/删除一列用sql语句实现很简单:
alter table 表名称 add 列名称 数据类型; // 数据库表中增加一列
alter table 表名称 drop column 列名称 数据类型; // 数据库中删除一列
但是,对于SQLite数据库而言有两个问题:
(1) 可以增加一列,但是该列只能是表的最后一列。
(2)不能删除一列。
对于第一个问题,如果你不觉得不爽的话,也没什么关系,并不影响使用,但是对于第二条而言问题就很大了,不支持删除一列还是很麻烦的事情。还要,条条大路通帝都。通过创建临时表的方法,可以很好的解决这个问题。
其实,说简单点儿,如果想删除表A中的一列或者一行,我们首先通过SQL创建一个临时表,然后把表A中期望保留的数据存储到临时表中,然后把表A删除,再通过SQL的create语句创建表A,最后将临时表中的数据再复制回来,算是一种曲线解决问题的方法吧。^_^
还是举两个例子说明最简单明了。
例1:在表coordinate中增加一列自动增长的id列。
- BEGIN TRANSACTION;
- CREATE TEMPORARY TABLE ptemp(provinceID int, longitude double, latitude double);
- INSERT INTO ptemp SELECT provinceID,longitude, latitude FROM coordinate;
- DROP TABLE coordinate;
- CREATE TABLE provincecoordinate(id INTEGER PRIMARY KEY AUTOINCREMENT, provinceID int, longitude double, latitude double);
- INSERT INTO provincecoordinate(provinceID, longitude, latitude) SELECT provinceID, longitude, latitude FROM ptemp;
- DROP TABLE ptemp;
- COMMIT;
BEGIN TRANSACTION;
CREATE TEMPORARY TABLE ptemp(provinceID int, longitude double, latitude double);
INSERT INTO ptemp SELECT provinceID,longitude, latitude FROM coordinate;
DROP TABLE coordinate;
CREATE TABLE provincecoordinate(id INTEGER PRIMARY KEY AUTOINCREMENT, provinceID int, longitude double, latitude double);
INSERT INTO provincecoordinate(provinceID, longitude, latitude) SELECT provinceID, longitude, latitude FROM ptemp;
DROP TABLE ptemp;
COMMIT;
例2:在表china中增加一列自动增长的id列。
- BEGIN TRANSACTION;
- CREATE TEMPORARY TABLE ptemp(longitude double, latitude double);
- INSERT INTO ptemp SELECT longitude, latitude FROM china;
- DROP TABLE china;
- CREATE TABLE china(id INTEGER PRIMARY KEY AUTOINCREMENT, longitude double, latitude double);
- INSERT INTO china(longitude, latitude) SELECT longitude, latitude FROM ptemp;
- DROP TABLE ptemp;
- COMMIT;
BEGIN TRANSACTION;
CREATE TEMPORARY TABLE ptemp(longitude double, latitude double);
INSERT INTO ptemp SELECT longitude, latitude FROM china;
DROP TABLE china;
CREATE TABLE china(id INTEGER PRIMARY KEY AUTOINCREMENT, longitude double, latitude double);
INSERT INTO china(longitude, latitude) SELECT longitude, latitude FROM ptemp;
DROP TABLE ptemp;
COMMIT;
阿科