SQLite教程(五):数据库和事务
一、Attach数据库:
ATTACHDATABASE语句添加另外一个数据库文件到当前的连接中,如果文件名为":memory:",我们可以将其视为内存数据库,内存数据库无法持久化到磁盘文件上。如果操作Attached数据库中的表,则需要在表名前加数据库名,如dbname.table_name。最后需要说明的是,如果一个事务包含多个Attached数据库操作,那么该事务仍然是原子的。见如下示例:
sqlite>CREATETABLEtesttable(first_colinteger); sqlite>INSERTINTOtesttableVALUES(1); sqlite>.backup'D:/mydb.db' --将当前连接中的主数据库备份到指定文件。 sqlite>.exit --重新登录sqlite命令行工具: sqlite>CREATETABLEtesttable(first_colinteger); sqlite>INSERTINTOtesttableVALUES(2); sqlite>INSERTINTOtesttableVALUES(1); sqlite>ATTACHDATABASE'D:/mydb.db'ASmydb; sqlite>.headeron --查询结果将字段名作为标题输出。 sqlite>.modecolumn --将每列都分开显示。 sqlite>SELECTt1.first_colFROMtesttablet1,mydb.testtablet2WHEREt.first_col=t2.first_col; first_col ---------- 1
二、Detach数据库:
卸载将当前连接中的指定数据库,注意main和temp数据库无法被卸载。见如下示例:
--该示例承载上面示例的结果,即mydb数据库已经被Attach到当前的连接中。 sqlite>DETACHDATABASEmydb; sqlite>SELECTt1.first_colFROMtesttablet1,mydb.testtablet2WHEREt.first_col=t2.first_col; Error:nosuchtable:mydb.testtable
三、事务:
在SQLite中,如果没有为当前的SQL命令(SELECT除外)显示的指定事务,那么SQLite会自动为该操作添加一个隐式的事务,以保证该操作的原子性和一致性。当然,SQLite也支持显示的事务,其语法与大多数关系型数据库相比基本相同。见如下示例:
sqlite>BEGINTRANSACTION; sqlite>INSERTINTOtesttableVALUES(1); sqlite>INSERTINTOtesttableVALUES(2); sqlite>COMMITTRANSACTION; --显示事务被提交,数据表中的数据也发生了变化。 sqlite>SELECTCOUNT(*)FROMtesttable; COUNT(*) ---------- 2 sqlite>BEGINTRANSACTION; sqlite>INSERTINTOtesttableVALUES(1); sqlite>ROLLBACKTRANSACTION; --显示事务被回滚,数据表中的数据没有发生变化。 sqlite>SELECTCOUNT(*)FROMtesttable; COUNT(*) ---------- 2