1. 看到网上说利用:alter table table_name drop column col_name ; Sqlite 其实是不支持删除列的方法的。
2. 网上还有人想利用:a. 创建新表
b. 导入数据
c. 删除旧表并更改表名
此种方法同样不可行,因为在创建表的同时,原先旧表中的primary key 的约束条件(其他约束条件没试)被无形的过滤掉了。
测试如下: 我的数据库中有一个表:
sqlite> .schema
CREATE TABLE Orders(Id_O int primary key , OrderNo int ,Id_P int ,idd text);
(NOTE: idd 这一列是我想要删除的)
数据内容如下:
sqlite> .headers on
sqlite> .nullvalue NULL
sqlite> select *from Orders ; (目的是显示列名,和让空值的地方显示NULL)
Id_O | OrderNo | Id_P | idd
1 | 77895 | 3 | NULL
2 | 44678 | 3 | NULL
3 | 22456 | 1 | NULL
4 | 24562 | 1 | NULL
5 | 34764 | 65 | NULL
sqlite> create table tempOrders as select Id_O, OrderNo, Id_P from Orders;
sqlite> select *from tempOrders;
Id_O | OrderNo | Id_P
1 | 77895 | 3
2 | 44678 | 3
3 | 22456 | 1
4 | 24562 | 1
5 | 34764 | 65
表面上看起来好像没有问题,其实约束条件已经不存在了,let check it;
sqlite> .schema
CREATE TABLE Orders(Id_O int primary key , OrderNo int , Id_P int , idd text);
CREATE TABLE tempOrders(Id_O INT , OrderNo INT , Id_P INT);
解决方法:
1. 备份数据Orders数据到.csv文件
在导出之前,需要关闭headers off, csv里面就没有列名信息了,方便导入到后面的finalOrders表
sqlite> .headers off
sqlite> .output temp.csv
sqlite> select Id_O ,OrderNo ,Id_P from Orders;
sqlite> .output stdout
现在temp.csv文件中保存了Orders的数据
2. 导入数据到表
sqlite> create table finalOrders(Id_O int primary key ,OrderNo int ,Id_P int);
sqlite> .import temp.csv finalOrders
3. 数据已经导入完成,check it ;
sqlite> .headers on
sqlite> select *from finalOrders;
Id_O | OrderNo | Id_P
1 | 77895 | 3
2 | 44678 | 3
3 | 22456 | 1
4 | 24562 | 1
5 | 34764 | 65
看看约束条件,是否依然在,
sqlite> .schema
CREATE TABLE finalOrders(Id_O int primary key , OrderNo int ,Id_P int);
sqlite> drop table Orders;
sqlite> alter table finalOrders rename to Orders;
搞定!转载请注明出处,混点人气也算是对我辛苦的奖励吧!!!