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;
          搞定!轉載請註明出處,混點人氣也算是對我辛苦的獎勵吧!!!
 
 
  
 
 
發佈了28 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章