SQLite 基礎(chǔ)知識(shí)
列操作
sqlite中不支持刪除列的操作毙沾,也不能夠修改主鍵骗卜。

從上圖可見(jiàn),SQLite官方并不支持delete或者drop列左胞。
那么在SQLite中寇仓,如果需要?jiǎng)h除某一列或者更改表的主碼,需要使用創(chuàng)建臨時(shí)表的方式進(jìn)行烤宙。創(chuàng)建一張表結(jié)構(gòu)正確的臨時(shí)表遍烦,并將原表中的數(shù)據(jù)轉(zhuǎn)移過(guò)去,再刪除原表门烂,重命名臨時(shí)表為正確表名乳愉。下面是一個(gè)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, "用戶數(shù)據(jù)庫(kù)第一次升級(jí)完成:修改XX表的主鍵!");
}
PRAGMA Statements
SQLite 的 PRAGMA 命令是一個(gè)特殊的命令屯远,可以用在 SQLite 環(huán)境內(nèi)控制各種環(huán)境變量和狀態(tài)標(biāo)志蔓姚。
sqlite_master
SQLite數(shù)據(jù)庫(kù)中一個(gè)特殊的名叫 SQLITE_MASTER 上執(zhí)行一個(gè)SELECT查詢以獲得所有表的索引。每一個(gè) SQLite 數(shù)據(jù)庫(kù)都有一個(gè)叫 SQLITE_MASTER 的表慨丐, 它定義數(shù)據(jù)庫(kù)的模式坡脐。
type值為table表示對(duì)應(yīng)的是表記錄,type值為index表示對(duì)應(yīng)的是索引的記錄房揭。
最后一欄列名為“sql”备闲,存儲(chǔ)的是創(chuàng)建表或者索引時(shí)的原始sql命令晌端。如果index是自動(dòng)生成的,那么sql為空恬砂。
sqlite_master表是只讀表咧纠,不能手工進(jìn)行內(nèi)容修改。
查詢數(shù)據(jù)庫(kù)中是否存在某張表泻骤,或者查詢數(shù)據(jù)庫(kù)中所有的表可用如下方式:
--查詢是否存在table_name這張表漆羔,實(shí)際上是查詢有幾個(gè)table_name表名存在,返回0則不存在狱掂,1則存在演痒。
SELECT count(*) AS c
FROM sqlite_master
WHERE TYPE ='table'
AND name ='table_name';
--查詢數(shù)據(jù)庫(kù)中所有的表
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;
}
臨時(shí)表不會(huì)出現(xiàn)在 SQLITE_MASTER 表中。臨時(shí)表及其索引和觸發(fā)器存放在另外一個(gè)叫 SQLITE_TEMP_MASTER 的表中趋惨。SQLITE_TEMP_MASTER 跟 SQLITE_MASTER 差不多鸟顺, 但它只是對(duì)于創(chuàng)建那些臨時(shí)表的應(yīng)用可見(jiàn)。如果要獲得所有表的列表器虾, 不管是永久的還是臨時(shí)的讯嫂,可以使用類似下面的命令:
SELECT name
FROM
(SELECT *
FROM sqlite_master
UNION ALL SELECT *
FROM sqlite_temp_master)
WHERE TYPE=’TABLE’
SQLite 表復(fù)制
- 復(fù)制整張表,包括表里面的數(shù)據(jù)曾撤。
CREATE TABLE affix_backup AS SELECT * FROM affix;
- 只復(fù)制表結(jié)構(gòu)端姚,不復(fù)制內(nèi)容。
CREATE TABLE affix_backup AS SELECT * FROM affix where 1=0;
- 內(nèi)容復(fù)制(SQLite不支持第一種)挤悉。
--把數(shù)據(jù)插入一張新建立的表中渐裸,這張表是執(zhí)行sql的時(shí)候建立的。
SELECT ... INTO new_tablename
FROM ...
WHERE ...
--或者
--把查詢出來(lái)的數(shù)據(jù)插入已經(jīng)建立好的表中
INSERT INTO tmp_tablename
SELECT ...
FROM ...
WHERE ...