浮头导航网

专注编程技术分享的开发者社区

第 8 章:更新与删除 (UPDATE, DELETE) - PostgreSQL入门

到目前为止,我们已经学会了如何创造数据 (INSERT) 和查询数据 (SELECT)。但是,世界是不断变化的,我们的数据也一样。

朋友可能会改名字,我们和朋友认识的年份会逐年增加,甚至… 有些朋友可能会从我们的生活中“消失”。


这一章,我们就来学习两个具有“修改”和“破坏”能力的操作:

  • UPDATE: 更新表中的现有记录。
  • DELETE: 删除表中的记录。

郑重警告 :这两个命令,尤其是 DELETE,是危险操作。一个不小心,就可能导致数据永久丢失。在执行它们之前,请务必三思,尤其要检查你的 WHERE 条件是否正确!


8.1 更新表中的记录 (UPDATE)

UPDATE 命令用于修改表中的数据。

基本语法:

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
  • UPDATE table_name: 指定要更新哪张表。
  • SET column1 = value1, ...: 指定要修改哪些列,以及它们的新值。
  • WHERE condition: 极其重要! 指定要更新哪些行。

8.2WHERE子句在UPDATE中的重要性

如果 UPDATE 语句中没有 WHERE 子句,它将会更新表中的【所有行】!

想象一下,如果你执行了 UPDATE friends SET name = '路人甲';,那么你所有的朋友都会被改名为“路人甲”,那将是一场灾难!

黄金法则:在执行 UPDATE 之前,先用 SELECT 语句和相同的 WHERE 条件测试一下,看看你将要影响的是不是你真正想要修改的那些行。

示例 1:给特定朋友改名
假设“小李”决定改名叫“李雷”。

第一步:用 SELECT 确认目标

SELECT * FROM friends WHERE name = '小李';

确认查询结果只有“小李”这一行,好,WHERE 条件没问题。

第二步:执行 UPDATE

UPDATE friends
SET name = '李雷'
WHERE name = '小李';

执行后,会返回 UPDATE 1,表示有 1 行被更新了。

验证一下SELECT * FROM friends WHERE id = 2;,你会发现名字已经变了。

示例 2:更新多个列
假设我们发现“张三”的生日和认识年数都记错了。

UPDATE friends
SET birthday = '1989-02-01', years_known = 11
WHERE id = 3;

这里我们用 id 来定位,因为 id 通常是独一无二的,比名字更可靠。

示例 3:基于旧值进行计算
新年到了,我们和所有朋友认识的年份都增加了一年。

UPDATE friends
SET years_known = years_known + 1;

注意,这个语句没有 WHERE 条件!这是少数我们希望更新全表的场景之一。它会把每一个朋友的 years_known 值都加 1。


8.3 删除表中的记录 (DELETE)

DELETE 命令用于从表中删除一行或多行数据。

基本语法:

DELETE FROM table_name
WHERE condition;
  • DELETE FROM table_name: 指定要从哪张表中删除。
  • WHERE condition: 极其极其重要! 指定要删除哪些行。

8.4WHERE子句在DELETE中的重要性

如果 DELETE 语句中没有 WHERE 子句,它将会删除表中的【所有数据】!

这通常比 UPDATE 全表更具毁灭性。执行 DELETE FROM friends; 之后,你的朋友列表就彻底空了!

白金法则:在执行 DELETE 之前,必须SELECT * 和相同的 WHERE 条件来预览你将要删除的数据,确保万无一失!

示例 4:删除一个朋友
假设我们和“赵四”不再是朋友了(只是假设)。

第一步:用 SELECT 确认目标

SELECT * FROM friends WHERE id = 4;

确认返回的是“赵四”那一行。

第二步:执行 DELETE

DELETE FROM friends
WHERE id = 4;

执行后,会返回 DELETE 1。现在,“赵四”就从我们的表中消失了。


8.5 使用TRUNCATE清空表

如果你确实是想删除一张表里的所有数据,而不是一部分,使用 DELETE FROM table_name; 当然可以,但有另一个更好、更快的命令:TRUNCATE

TRUNCATE TABLE friends;

TRUNCATE vs DELETE (无 WHERE)

特性

DELETE FROM table_name;

TRUNCATE TABLE table_name;

速度

慢。一行一行地删,记录日志。

极快。直接释放数据页,像格式化。

事务日志

每删一行都记录,日志文件会很大。

记录的操作很少,日志占用小。

触发器

会为每一行触发 DELETE 触发器。

不会触发 DELETE 触发器。

返回

返回删除了多少行 (DELETE 4)。

不返回计数。

回滚

可以被 ROLLBACK

通常不能(或在某些数据库中行为不同)。

简单来说:想清空整张表,用 TRUNCATE。想删除满足条件的某些行,用 DELETE


本章小结

你已经掌握了操作数据的最后两块拼图!现在你拥有了对数据完整的 CRUD (Create, Read, Update, Delete) 能力。

  • 我们学会了用 UPDATE修改数据,并深刻理解了 WHERE 的重要性。
  • 我们学会了用 DELETE删除数据,并养成了先 SELECTDELETE 的好习惯。
  • 我们还了解了更高效的清空工具 TRUNCATE

到目前为止,我们查询出的数据都是“乱序”的(取决于数据库内部的存储顺序)。如果我们希望结果按照我们指定的顺序(比如按生日、按认识年份)排列呢?

下一章,我们将学习 ORDER BY (排序)LIMIT (限制),让你的查询结果更加井然有序!准备好给你的数据排排坐了吗?我们下一章见!

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言