SQLite 基礎知識

SQLite 基礎知識

SQLite

列操作

sqlite中不支持刪除列的操作,也不能夠修改主鍵。
ALTER TABLE操作
從上圖可見,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中,如果需要刪除某一列或者更改表的主碼,需要使用創建臨時表的方式進行。創建一張表結構正確的臨時表,並將原表中的數據轉移過去,再刪除原表,重命名臨時表爲正確表名。下面是一個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 差不多, 但它只是對於創建那些臨時表的應用可見。如果要獲得所有表的列表, 不管是永久的還是臨時的,可以使用類似下面的命令:
“`sql
SELECT name
FROM
(SELECT *
FROM sqlite_master
UNION ALL SELECT *
FROM sqlite_temp_master)
WHERE TYPE=’TABLE’


## SQLite 表複製
* 複製整張表,包括表裏面的數據。
```sql
CREATE TABLE affix_backup AS SELECT * FROM affix;




<div class="se-preview-section-delimiter"></div>
  • 只複製表結構,不復制內容。
CREATE TABLE affix_backup AS SELECT * FROM affix where 1=0;




<div class="se-preview-section-delimiter"></div>
  • 內容複製(SQLite不支持第一種)。
--把數據插入一張新建立的表中,這張表是執行sql的時候建立的。
SELECT ... INTO new_tablename
FROM ...
WHERE ...
--或者
--把查詢出來的數據插入已經建立好的表中
INSERT INTO tmp_tablename
SELECT ...
FROM ...
WHERE ...
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章