SQLite 进阶技巧:ALTER TABLE 和事务控制(八)

在 SQLite 数据库管理中,掌握 ALTER TABLE 命令、视图管理和事务控制是提升数据库操作效率的关键技能。本文将详细介绍这些功能的使用方法、应用场景以及最佳实践,帮助你在实际项目中更好地利用 SQLite。

什么是 ALTER TABLE 命令?

ALTER TABLE 命令用于修改已存在的表结构。在 SQLite 中,ALTER TABLE 主要支持两种操作:重命名表和在现有表中添加新的列。与其他数据库管理系统不同,SQLite 不支持通过 ALTER TABLE 执行更多的复杂操作,如删除列或修改列的数据类型。

重命名表

重命名表的基本语法如下:

ALTER TABLE database_name.table_name RENAME TO new_table_name;

假设我们有一个名为 COMPANY 的表,我们可以将其重命名为 OLD_COMPANY:

ALTER TABLE COMPANY RENAME TO OLD_COMPANY;

这条命令将 COMPANY 表重命名为 OLD_COMPANY。

添加新列

在现有表中添加新列的基本语法如下:

ALTER TABLE database_name.table_name ADD COLUMN column_def...;

继续使用 OLD_COMPANY 表的例子,我们可以在表中添加一个新的列 SEX:

ALTER TABLE OLD_COMPANY ADD COLUMN SEX CHAR(1);

执行上述命令后,OLD_COMPANY 表将新增一列 SEX,并且这一列的初始值为 NULL。

示例

假设 COMPANY 表有如下记录:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

首先,我们将 COMPANY 表重命名为 OLD_COMPANY:

ALTER TABLE COMPANY RENAME TO OLD_COMPANY;

然后,在 OLD_COMPANY 表中添加 SEX 列:

ALTER TABLE OLD_COMPANY ADD COLUMN SEX CHAR(1);

此时,OLD_COMPANY 表的结构变为:

ID          NAME        AGE         ADDRESS     SALARY      SEX
----------  ----------  ----------  ----------  ----------  ---
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

清空表数据

SQLite 并没有 TRUNCATE TABLE 命令,但可以通过 DELETE 命令清空表中的所有数据。然而,这种方法不会重置自增列的计数器。为了重置自增列,可以使用以下方法:

DELETE FROM sqlite_sequence WHERE name = 'table_name';

示例

假设 COMPANY 表有如下记录:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

首先,删除表中的所有记录:

DELETE FROM COMPANY;

然后,重置自增列的计数器:

DELETE FROM sqlite_sequence WHERE name = 'COMPANY';

最后,执行 VACUUM 命令以释放未使用的空间:

VACUUM;

视图管理

视图(View)是存储在数据库中的预定义查询结果。视图可以简化复杂的查询,限制数据访问,以及汇总多个表中的数据。SQLite 视图是只读的,不能直接对其进行插入、更新或删除操作。但可以通过触发器来实现这些操作。

创建视图

创建视图的基本语法如下:

CREATE [TEMP | TEMPORARY] VIEW view_name AS
SELECT column1, column2.....
FROM table_name
WHERE [condition];

假设 COMPANY 表有如下记录:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

我们可以创建一个只包含 ID、NAME 和 AGE 列的视图 COMPANY_VIEW:

CREATE VIEW COMPANY_VIEW AS
SELECT ID, NAME, AGE
FROM COMPANY;

查询 COMPANY_VIEW 的结果如下:

ID          NAME        AGE
----------  ----------  ----------
1           Paul        32
2           Allen       25
3           Teddy       23
4           Mark        25
5           David       27
6           Kim         22
7           James       24

删除视图

删除视图的基本语法如下:

DROP VIEW view_name;

删除 COMPANY_VIEW 视图:

DROP VIEW COMPANY_VIEW;

事务控制

事务(Transaction)是一组对数据库的更改,这些更改要么全部成功,要么全部失败。事务具有四个标准属性,通常称为 ACID 属性:

  • 原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败。
  • 一致性(Consistency):事务执行前后,数据库保持一致状态。
  • 隔离性(Isolation):事务之间互不影响。
  • 持久性(Durability):事务一旦提交,其结果将永久保存。

事务控制命令

  • BEGIN TRANSACTION:开始事务。
  • COMMIT:提交事务,保存所有更改。
  • ROLLBACK:回滚事务,撤销所有未提交的更改。

示例

假设 COMPANY 表有如下记录:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

开始一个事务,并删除年龄为 25 的记录,最后回滚事务:

BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
ROLLBACK;

检查 COMPANY 表,记录没有变化:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

再次开始一个事务,删除年龄为 25 的记录,最后提交事务:

BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
COMMIT;

检查 COMPANY 表,记录已被删除:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
3           Teddy       23          Norway      20000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

总结

本文详细介绍了 SQLite 中的 ALTER TABLE 命令、视图管理和事务控制。通过这些功能,你可以更灵活地管理表结构、简化复杂查询,并确保数据的一致性和完整性。希望本文的内容对你在实际项目中使用 SQLite 提供了有价值的参考。