首页 / 问答 / pgsql数据库中如何更新表中某个字段的值等于另一个关联表中的一个字段值呢?

pgsql数据库中如何更新表中某个字段的值等于另一个关联表中的一个字段值呢?

数据库 Database PostgreSQL 2.21K 次浏览
0

在pgsql数据库中,假设我们有两个表:studentsclassesstudents表中的class_id是与classes表关联的外键。

我们想要更新students中的class_name字段的值,使其等于classes中的name字段的值,其中这两个表通过id列进行连接,应该如何编写更新脚本呢?

回复 [×]
提交评论
请输入评论内容

1 个回答

  • 0

    要在pgsql数据库中完成这个问题的关联表更新,可以使用UPDATE...FROM...语法。

    首先创建示例数据表:

    CREATE TABLE classes (
      id serial PRIMARY KEY,
      name varchar(50) NOT NULL
    );
    
    CREATE TABLE students (
      id serial PRIMARY KEY,
      name varchar(50) NOT NULL,
      age int NOT NULL,
      class_id int NOT NULL,
      class_name varchar(50) NOT NULL DEFAULT '',
      FOREIGN KEY (class_id) REFERENCES classes (id)
    );
    

    写入测试数据:

    INSERT INTO classes (name) VALUES ('Mathematics'), ('Science'), ('History');
    
    INSERT INTO students (name, age, class_id, class_name) VALUES
      ('Alice', 16, 1, ''),
      ('Bob', 17, 2, ''),
      ('Charlie', 15, 1, ''),
      ('David', 16, 3, ''),
      ('Emily', 15, 2, ''),
      ('Frank', 17, 3, ''),
      ('Grace', 14, 1, ''),
      ('Henry', 16, 2, ''),
      ('Isabelle', 15, 3, ''),
      ('John', 17, 1, '');
    

    查看示例数据:

    SELECT * FROM public.students
    ORDER BY id ASC
    

    上述示例中,students表包含学生信息,包括新增的class_name字段,其默认值为一个空字符串。示例数据中包含了三个班级和十个学生,其中class_name字段的值全部都是空字符串。

    要更新students表中的class_name字段为classes表中name字段对应的值,可以执行以下UPDATE语句:

    UPDATE students
    SET class_name = classes.name
    FROM classes
    WHERE students.class_id = classes.id;
    

    这个UPDATE语句将使用FROM子句连接students表和classes表,并使用WHERE子句指定连接条件。它会更新students表中的class_name字段为classes表中对应class_id的行的name字段的值。

    请注意,这个UPDATE语句将更新所有的行,包括那些已经有了正确class_name值的行。如果您只想更新那些class_name值为默认值的行,可以添加一个额外的过滤条件,如下所示:

    UPDATE students
    SET class_name = classes.name
    FROM classes
    WHERE students.class_id = classes.id
    AND students.class_name = '';
    

    这个UPDATE语句只会更新那些class_name值为默认值的行,而不会影响已经有了正确class_name值的行。

    查看更新后的students表数据:

     id |   name   | age | class_id |   class_name   
    ----+----------+-----+----------+----------------
      1 | Alice    |  16 |        1 | Mathematics
      2 | Bob      |  17 |        2 | Science
      3 | Charlie  |  15 |        1 | Mathematics
      4 | David    |  16 |        3 | History
      5 | Emily    |  15 |        2 | Science
      6 | Frank    |  17 |        3 | History
      7 | Grace    |  14 |        1 | Mathematics
      8 | Henry    |  16 |        2 | Science
      9 | Isabelle |  15 |        3 | History
     10 | John     |  17 |        1 | Mathematics
    (10 rows)
    
    Rector的个人主页

    Rector

    2023-02-28 回答

    我来回答