Sqlite 删除列

     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;
          搞定!转载请注明出处,混点人气也算是对我辛苦的奖励吧!!!
 
 
  
 
 

你可能感兴趣的:(数据库)