【问题标题】:update multiple rows in one shot一次更新多行
【发布时间】:2021-02-15 16:16:35
【问题描述】:

考虑以下情况:

我有三个表:StudentStudentCourseCourse

Student 包含有关学生的信息以及作为主键的唯一 id (uuid)。

Course 包含课程的唯一id(uuid)(主键)和课程的name(文本)。

StudentCourse 通过将courseId (uuid) 与studentId (uuid) 相关联来跟踪学生学习的课程。 courseId 是从 Course 引用 id 的 FK,studentId 是从 Student 引用 id 的 FK。

假设我在Student 中有以下行:

id                name
--------------------------
student_id_john  John Doe

Course(3 行):

id               name
---------------------------
biology_id       Biology
mathematics_id   Mathematics
physics_id       Physics

StudentCourse(1 行):

studentId         courseId
----------------------------
student_id_john   physics_id

所以目前 John Doe 正在上物理课。

我想更新 StudentCourse 表以反映新的变化:将“物理”课程替换为“数学”课程,并为 John Doe 添加“生物学”课程。

假设我有以下数组(大小可以变化):

let course_arr = ["Mathematics", "Biology"]

我想通过以下方式更新StudentCourse 表:

  1. 首先从Course 中选择适当的id,其中name = "数学" 和name = "生物学"
  2. 更新现有行(在StudentCourse 中设置courseId = mathematics_id 其中studentId = student_id_john
  3. 插入新行:studentId = student_id_johncourseId = biology_id

有没有办法在一个查询中完成所有这些操作?我只想访问我的数据库一次。我试图避免多次调用数据库。

我尝试了以下查询(将物理课程替换为数学课程),但它不起作用:

update student_course 
set "courseId"  = subquery.id
from (select id from course where name = 'Mathematics') as subquery
where "studentId" = student_id_john

【问题讨论】:

  • 我可能会简单地为该用户删除student_course 中的所有行,然后插入两个(新)课程

标签: arrays postgresql sql-update where-clause


【解决方案1】:

如果你真的坚持用一个语句来做:

WITH new_courses AS (
   SELECT '["Mathematics", "Biology"]'::jsonb AS values
), remove AS (
   DELETE FROM student_course
   USING course, new_courses
   WHERE student_course."courseId" = course.id
     AND student_course."studentId" = student_id_john
     AND NOT (to_jsonb(course.name) <@ new_courses.values)
)
INSERT INTO student_course ("studentId", "courseId")
SELECT student_id_john, course.id
FROM course
WHERE to_jsonb(course.name) <@ new_courses.values;

【讨论】:

    猜你喜欢
    • 2016-06-04
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 2014-04-05
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多