学习前提
理解主键、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。仍有两行,因为删除没有提交。