SQLite

SQLite 基礎(chǔ)知識(shí)

SQLite

列操作

sqlite中不支持刪除列的操作毙沾,也不能夠修改主鍵骗卜。


ALTER TABLE操作
ALTER TABLE操作

從上圖可見(jiàn),SQLite官方并不支持delete或者drop列左胞。

SQLite supports a limited subset of ALTER TABLE. The ALTER TABLE command in SQLite allows the user to rename a table or to add a new column to an existing table.

那么在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)容修改。

sqlite_master.png

查詢數(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 ...
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末装悲,一起剝皮案震驚了整個(gè)濱河市昏鹃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诀诊,老刑警劉巖洞渤,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異属瓣,居然都是意外死亡载迄,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門抡蛙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)护昧,“玉大人,你說(shuō)我怎么就攤上這事粗截⊥锇遥” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)绽榛。 經(jīng)常有香客問(wèn)我湿酸,道長(zhǎng),這世上最難降的妖魔是什么灭美? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任推溃,我火速辦了婚禮,結(jié)果婚禮上冲粤,老公的妹妹穿的比我還像新娘美莫。我一直安慰自己,他們只是感情好梯捕,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著窝撵,像睡著了一般傀顾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碌奉,一...
    開(kāi)封第一講書(shū)人閱讀 52,696評(píng)論 1 312
  • 那天短曾,我揣著相機(jī)與錄音,去河邊找鬼赐劣。 笑死嫉拐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的魁兼。 我是一名探鬼主播婉徘,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼咐汞!你這毒婦竟也來(lái)了盖呼?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤化撕,失蹤者是張志新(化名)和其女友劉穎几晤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體植阴,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蟹瘾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掠手。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片憾朴。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惨撇,靈堂內(nèi)的尸體忽然破棺而出伊脓,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布报腔,位于F島的核電站株搔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏纯蛾。R本人自食惡果不足惜纤房,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望翻诉。 院中可真熱鬧炮姨,春花似錦、人聲如沸碰煌。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)芦圾。三九已至蛾派,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間个少,已是汗流浹背洪乍。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留夜焦,地道東北人壳澳。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像茫经,于是被迫代替她去往敵國(guó)和親巷波。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容