学习前提

理解主键、WHERE和基本SELECT;仅在独立内存数据库练习写入。

本课完成后你能做什么

使用精确条件修改数据,并将关联修改作为整体处理。

先理解机制

UPDATE和DELETE的WHERE决定影响范围。执行前用相同条件SELECT核对候选行;没有WHERE通常影响全表。主键条件适合修改明确的一条记录。

事务将一组操作组合成一个提交单元。BEGIN开始,COMMIT保留,ROLLBACK撤销尚未提交的操作。事务不能撤销已经提交的任意历史更改,备份仍有独立价值。

本例先演示一次被取消的修改,再提交正确结果。读取changes()只能反映最近相关语句的变更情况,不应将它当作整个系统的审计日志。

可运行示例

本系列使用SQLite 3方言。打开一个全新的内存练习数据库,例如终端执行 sqlite3 :memory:,再执行本课整段SQL。每章都自带建表和样例数据,不连接网站业务数据库。

CREATE TABLE progress(id INTEGER PRIMARY KEY, done INTEGER NOT NULL);
INSERT INTO progress VALUES(1,0),(2,0);
BEGIN;
UPDATE progress SET done=99 WHERE id=1;
ROLLBACK;
BEGIN;
UPDATE progress SET done=1 WHERE id=1;
COMMIT;
SELECT id, done FROM progress ORDER BY id;

推演与验证

99被回滚,最终id1为1、id2为0。事务中的临时值不等于最终提交状态。

常见错误与边界

在应用中必须针对异常明确执行回滚,不能假设每种SQL错误都自动撤销整笔事务。本课脚本没有并发写入场景。

动手练习

在新事务中删除id2,然后回滚,验证记录仍在。

参考解法与理由

依次执行BEGIN; DELETE FROM progress WHERE id=2; ROLLBACK;再SELECT。仍有两行,因为删除没有提交。

进一步阅读