欢迎投稿

今日深度:

SQLite 基础知识,sqlite基础知识

SQLite 基础知识,sqlite基础知识


SQLite 基础知识

SQLite

列操作

sqlite中不支持删除列的操作,也不能够修改主键。

从上图可见,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表是只读表,不能手工进行内容修改。

查询数据库中是否存在某张表,或者查询数据库中所有的表可用如下方式:

--查询是否存在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 ...

www.htsjk.Com true http://www.htsjk.com/SQLite/29879.html NewsArticle SQLite 基础知识,sqlite基础知识 SQLite 基础知识 SQLite 列操作 sqlite中不支持删除列的操作,也不能够修改主键。 从上图可见,SQLite官方并不支持delete或者drop列。 SQLite supports a limited subs...
相关文章
    暂无相关文章
评论暂时关闭