2014-09-03 57 views
1

我想找到刪除SQLite列中的最佳方法。這裏有兩種方法,我發現:SQLite刪除列的方法:使用臨時表與重命名使用ALTER TABLE

從官方網站http://www.sqlite.org/faq.html#q11

BEGIN TRANSACTION; 
CREATE TEMPORARY TABLE t1_backup(a,b); 
INSERT INTO t1_backup SELECT a,b FROM t1; 
DROP TABLE t1; 
CREATE TABLE t1(a,b); 
INSERT INTO t1 SELECT a,b FROM t1_backup; 
DROP TABLE t1_backup; 
COMMIT; 

How to delete or add column in SQLITE?(這也是從官方網站http://sqlite.org/lang_altertable.html):

1. create new table as the one you are trying to change, 
2. copy all data, 
3. drop old table, 
4. rename the new one. 

第一種方法使用一個臨時表作爲中間人來保存價值。第二種方法直接將值複製到新表並稍後重命名錶名。從頂級的角度來看,這些是我看到的唯一差異。哪一個更有效?選擇一個優勢是否有優勢?

是否有任何我應該注意的回滾安全的基礎信息?

+0

在我看來,第二個效率更高,因爲只有一個'INSERT' – cha 2014-09-03 23:21:01

+0

如果做第二個方法,我會先重命名舊錶,然後創建新表,然後複製。這個放置是可選的,並且可以在確認新表正在按預期工作之後完成。 – Turophile 2014-09-04 08:00:32

回答

0

使用臨時表可能會比較慢,因爲所有數據都必須複製兩次。 但是,創建一個新表並重命名它需要更多空間用於實際數據庫(它需要同時保存新舊錶),而臨時表將存儲在temporary database中。

這兩種方法在事務內部運行時都非常安全。

+0

第一種方法是不是也需要兩個表副本的空間(儘管一個被聲明爲臨時表)。 – Turophile 2014-09-04 08:02:00

+0

@Turophile從我讀的內容來看,數據庫的大小要麼增長要麼保持不變,直到清理完爲止。在非臨時數據庫中創建一個新表會增加它的大小,而臨時表並不是因爲它存儲在臨時數據庫中。 http://stackoverflow.com/questions/2143800/change-sqlite-file-size-after-delete-from-table – kyrax 2014-09-04 23:19:18

+0

你可能是對的 - 我不是sqlite的專家,這可能與其他數據庫在如何不同它管理存儲。 – Turophile 2014-09-05 06:30:21