CodeGym /课程 /SQL SELF /使用 RETURNING 在插入/更新后获取数据

使用 RETURNING 在插入/更新后获取数据

SQL SELF
第 22 级, 课程 0
可用

今天我们要给自己的知识库加点魔法: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 email
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 让数据操作变得更简单了。这绝对是你做真实项目时会爱上的工具之一。冲鸭,去探索更多新技能吧!

2
任务
SQL SELF, 第 22 级, 课程 0
已锁定
插入数据并返回标识符
插入数据并返回标识符
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION