SQLite 基礎知識
列操作
sqlite中不支持刪除列的操作,也不能夠修改主鍵。

ALTER TABLE操作
從上圖可見,SQLite官方并不支持delete或者drop列。
那么在SQLite中,如果需要刪除某一列或者更改表的主碼,需要使用創建臨時表的方式進行。創建一張表結構正確的臨時表,并將原表中的數據轉移過去,再刪除原表,重命名臨時表為正確表名。下面是一個Java的例子:
List<String> sqls = new ArrayList<>();
if (isTableExist(dbManager, "XX")) {
sqls.add("CREATE TABLE \"XX_tmp\" (\"arg0\" TEXT ,\"arg1\" TEXT ,\"arg2\" TEXT ,\"arg3\" TEXT ,\"arg4\" TEXT PRIMARY KEY ,\"attflag\" TEXT ,\"attmsg\" TEXT );");
sqls.add("INSERT INTO XX_tmp SELECT * FROM XX;");
sqls.add("DROP TABLE XX;");
sqls.add("ALTER TABLE XX_tmp RENAME TO XX;");
dbManager.getDatabase().beginTransaction();
for (String sql : sqls)
dbManager.execNonQuery(sql);
dbManager.getDatabase().endTransaction();
U.L.d(TAG, "用戶數據庫第一次升級完成:修改XX表的主鍵!");
}
PRAGMA Statements
SQLite 的 PRAGMA 命令是一個特殊的命令,可以用在 SQLite 環境內控制各種環境變量和狀態標志。
sqlite_master
SQLite數據庫中一個特殊的名叫 SQLITE_MASTER 上執行一個SELECT查詢以獲得所有表的索引。每一個 SQLite 數據庫都有一個叫 SQLITE_MASTER 的表, 它定義數據庫的模式。
type值為table表示對應的是表記錄,type值為index表示對應的是索引的記錄。
最后一欄列名為“sql”,存儲的是創建表或者索引時的原始sql命令。如果index是自動生成的,那么sql為空。
sqlite_master表是只讀表,不能手工進行內容修改。
sqlite_master.png
查詢數據庫中是否存在某張表,或者查詢數據庫中所有的表可用如下方式:
--查詢是否存在table_name這張表,實際上是查詢有幾個table_name表名存在,返回0則不存在,1則存在。
SELECT count(*) AS c
FROM sqlite_master
WHERE TYPE ='table'
AND name ='table_name';
--查詢數據庫中所有的表
SELECT name AS TABLE_NAME
FROM sqlite_master
WHERE TYPE='table';
上面用到的isTableExist(DbManager dbManager, String tableName)方法如下:
//判斷表是否存在
protected final boolean isTableExist(DbManager dbManager, String tableName) {
boolean isExist = false;
String sql = "SELECT COUNT(*) AS c FROM sqlite_master WHERE TYPE ='table' AND NAME ='" + tableName + "';";
try {
Cursor mCursor = dbManager.execQuery(sql);
if (mCursor.moveToNext()) {
int count = mCursor.getInt(0);
if (count > 0) {
isExist = true;
}
}
} catch (DbException e) {
e.printStackTrace();
}
return isExist;
}
臨時表不會出現在 SQLITE_MASTER 表中。臨時表及其索引和觸發器存放在另外一個叫 SQLITE_TEMP_MASTER 的表中。SQLITE_TEMP_MASTER 跟 SQLITE_MASTER 差不多, 但它只是對于創建那些臨時表的應用可見。如果要獲得所有表的列表, 不管是永久的還是臨時的,可以使用類似下面的命令:
SELECT name
FROM
(SELECT *
FROM sqlite_master
UNION ALL SELECT *
FROM sqlite_temp_master)
WHERE TYPE=’TABLE’
SQLite 表復制
- 復制整張表,包括表里面的數據。
CREATE TABLE affix_backup AS SELECT * FROM affix;
- 只復制表結構,不復制內容。
CREATE TABLE affix_backup AS SELECT * FROM affix where 1=0;
- 內容復制(SQLite不支持第一種)。
--把數據插入一張新建立的表中,這張表是執行sql的時候建立的。
SELECT ... INTO new_tablename
FROM ...
WHERE ...
--或者
--把查詢出來的數據插入已經建立好的表中
INSERT INTO tmp_tablename
SELECT ...
FROM ...
WHERE ...