今天我们要给自己的知识库加点魔法:RETURNING 命令。这玩意儿超好用,可以让你在插入、更新或者删除数据后,马上把需要的数据拿回来。想象一下,你往表里插入一行数据,立刻就能拿到它的唯一标识符,是不是很爽?当然啦!赶紧学起来!
当你执行 INSERT、UPDATE 或 DELETE 操作后,经常会想马上知道被影响的数据内容。比如,插入新的一行后,你想知道它自动生成的主键(唯一ID)。不用再发一个单独的查询去拿这些数据,直接在操作时用 RETURNING 就能搞定。
比如你要往 students 表里加一个新学生。每个学生都有个唯一ID(比如 student_id),是自动生成的。加完新记录后,你想马上用这个ID去给学生报名课程。如果不用 RETURNING,你得先插入学生,再写个 SELECT 查询去找ID。有了 RETURNING,一条SQL就能全搞定!
RETURNING 命令的语法
RETURNING 要加在 INSERT、UPDATE 和 DELETE 操作的最后面。通用语法如下:
-- INSERT 语法:
INSERT INTO 表名 (column1, column2, ...)
VALUES (value1, value2, ...)
RETURNING 列名;
-- UPDATE 语法:
UPDATE 表名
SET column1 = value1
WHERE 条件
RETURNING 列名;
-- DELETE 语法:
DELETE FROM 表名
WHERE 条件
RETURNING 列名;
RETURNING 让你指定想返回哪些被修改行的列。可以只要一个(比如主键),也可以要好几个。
配合 INSERT 用 RETURNING
来看个 students 表的例子:
CREATE TABLE students (
student_id SERIAL PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
email TEXT UNIQUE
);
加个新学生,顺便直接拿到他的ID:
INSERT INTO students (first_name, last_name, email)
VALUES ('Otto', 'Lin', 'otto.lin@example.com')
RETURNING student_id;
这个查询会返回新加学生的ID:
| student_id |
|---|
| 1 |
你刚刚加了 Otto Lin,PostgreSQL 马上就把他的 student_id 给你了。是不是很方便?当然啦!
再来个例子,插入时直接拿多个字段。如果你不只想要 student_id,还想要学生的名字和姓,也可以用 RETURNING 一起查出来:
INSERT INTO students (first_name, last_name, email)
VALUES ('Alex', 'Ming', 'alex.ming@example.com')
RETURNING student_id, first_name, last_name;
结果:
| student_id | first_name | last_name |
|---|---|---|
| 2 | Alex | Ming |
配合 UPDATE 用 RETURNING
有时候你更新了数据,想知道到底改了哪些行。RETURNING 这时候就特别好用。
比如 Otto Lin 想换个邮箱。我们更新他的数据,顺便拿到被改的那一行的信息:
UPDATE students
SET email = 'lin.new@example.com'
WHERE student_id = 1
RETURNING student_id, email;
结果:
| student_id | |
|---|---|
| 1 | lin.new@example.com |
现在你就知道 student_id = 1 的学生邮箱已经被成功更新啦。
配合 DELETE 用 RETURNING
当你从表里删数据时,知道被删掉的是哪些行也很有用。用 RETURNING 就能拿到被删行的数据。
举个例子,假设 Peter Ming 被退学了。我们把他从表里删掉,同时拿到他的相关信息:
DELETE FROM students
WHERE student_id = 2
RETURNING student_id, first_name, last_name;
结果:
| student_id | first_name | last_name |
|---|---|---|
| 2 | Peter | Ming |
这样你就能确定被删掉的就是 Peter Ming。
实用小贴士
每当你需要被影响行的数据时,都用 RETURNING。 这样能省掉很多多余的数据库查询。
尽量只返回你需要的数据。 如果只要主键,就只查主键。
配合事务用 RETURNING 更强大。 比如你要往多个相关表插数据,可以用 RETURNING 传递ID。
用 RETURNING 时常见的坑
新手经常会忘了 RETURNING 只对被修改的行有效。比如 UPDATE 或 DELETE 没有找到任何行,RETURNING 就会返回空结果。别慌,这很正常。只要确认你的查询没问题,或者在应用代码里处理这种情况就行。
还有一个常见错误:试图用 RETURNING 查不存在的列。一定要确认你要的列在表里真的存在。
现在你已经知道怎么用 RETURNING 让数据操作变得更简单了。这绝对是你做真实项目时会爱上的工具之一。冲鸭,去探索更多新技能吧!
GO TO FULL VERSION