SQLite教程(五):数据库和事务

随心笔谈2年前发布 admin
208 0 0

文章摘要

这篇文章介绍了SQLite中关于数据库管理的三个关键操作:`ATTACH DATABASE`、`DETACH DATABASE`和`TRANSACTION`。以下是对文章的简要总结: 1. **ATTACH DATABASE** 该操作用于在现有数据库连接中附加其他数据库文件,包括内存数据库(文件名`:memory:`)。附加的数据库文件无法持久化到磁盘。在附加数据库时,若需要操作附加数据库中的表,需在表名前加上数据库名(如`dbname.table_name`)。多个`ATTACH`操作仍保持事务的原子性。例如,可以通过以下代码实现: ``` CREATE TABLE testtable (first_col integer); INSERT INTO testtable VALUES(1); Backup 'D:/mydb.db'; ATTACH DATABASE 'D:/mydb.db' AS mydb; .header .mode column SELECT t1.first_col FROM testtable t1, mydb.testtable t2 WHERE t.first_col=t2.first_col; ``` 2. **DETACH DATABASE** 该操作用于从当前数据库连接中卸载指定的数据库文件。需要注意的是,主数据库和临时数据库无法被卸载。例如,卸载操作后会出现错误提示,如: ``` DETACH DATABASE mydb; SELECT t1.first_col FROM testtable t1, mydb.testtable t2 WHERE t.first_col=t2.first_col; Error: no such table: mydb.testtable ``` 3. **TRANSACTION** SQLite默认为未涉及SELECT操作的SQL命令自动创建隐式事务,以保证操作的原子性和一致性。此外,用户也可以显式创建事务,其语法与大多数关系型数据库相似。例如: ``` BEGIN TRANSACTION; INSERT INTO testtable VALUES(1); INSERT INTO testtable VALUES(2); COMMIT TRANSACTION; SELECT COUNT(*) FROM testtable; COUNT(*) ---------- 2 ROLLBACK TRANSACTION; SELECT COUNT(*) FROM testtable; COUNT(*) ---------- 2 ``` 总结而言,文章通过示例代码和详细说明,展示了SQLite中如何通过`ATTACH DATABASE`和`DETACH DATABASE`管理数据库文件,以及如何通过`TRANSACTION`控制事务操作以确保数据的一致性。



一、Attach数据库:

     ATTACH DATABASE语句添加另外一个数据库文件到当前的连接中,如果文件名为”:memory:”,我们可以将其视为内存数据库,内存数据库无法持久化到磁盘文件上。如果操作Attached数据库中的表,则需要在表名前加数据库名,如dbname.table_name。最后需要说明的是,如果一个事务包含多个Attached数据库操作,那么该事务仍然是原子的。见如下示例:

 

复制代码 代码如下:

    sqlite> CREATE TABLE testtable (first_col integer);

    sqlite> INSERT INTO testtable VALUES(1);

    sqlite> .backup ‘D:/mydb.db’   –将当前连接中的主数据库备份到指定文件。

    sqlite> .exit

    –重新登录sqlite命令行工具:

    sqlite> CREATE TABLE testtable (first_col integer);

    sqlite> INSERT INTO testtable VALUES(2);

    sqlite> INSERT INTO testtable VALUES(1);

    sqlite> ATTACH DATABASE ‘D:/mydb.db’ AS mydb;   

    sqlite> .header on            –查询结果将字段名作为标题输出。

    sqlite> .mode column        –将每列都分开显示。

    sqlite> SELECT t1.first_col FROM testtable t1, mydb.testtable t2 WHERE t.first_col=t2.first_col;

    first_col

    ———-

    1   

二、Detach数据库:

    卸载将当前连接中的指定数据库,注意main和temp数据库无法被卸载。见如下示例:

 

复制代码 代码如下:

    –该示例承载上面示例的结果,即mydb数据库已经被Attach到当前的连接中。

    sqlite> DETACH DATABASE mydb;

    sqlite> SELECT t1.first_col FROM testtable t1, mydb.testtable t2 WHERE t.first_col=t2.first_col;

    Error: no such table: mydb.testtable

   

三、事务:

    在SQLite中,如果没有为当前的SQL命令(SELECT除外)显示的指定事务,那么SQLite会自动为该操作添加一个隐式的事务,以保证该操作的原子性和一致性。当然,SQLite也支持显示的事务,其语法与大多数关系型数据库相比基本相同。见如下示例:

 

复制代码 代码如下:

    sqlite> BEGIN TRANSACTION;

    sqlite> INSERT INTO testtable VALUES(1);

    sqlite> INSERT INTO testtable VALUES(2);

    sqlite> COMMIT TRANSACTION;      –显示事务被提交,数据表中的数据也发生了变化。

    sqlite> SELECT COUNT(*) FROM testtable;

    COUNT(*)

    ———-

    2

    sqlite> BEGIN TRANSACTION;

    sqlite> INSERT INTO testtable VALUES(1);

    sqlite> ROLLBACK TRANSACTION;  –显示事务被回滚,数据表中的数据没有发生变化。

    sqlite> SELECT COUNT(*) FROM testtable;

    COUNT(*)

    ———-

    2

您可能感兴趣的文章:SQLite教程(一):SQLite数据库介绍SQLite教程(二):C/C++接口简介SQLite教程(三):数据表和视图简介SQLite教程(四):内置函数SQLite教程(五):索引和数据分析/清理

© 版权声明

相关文章