pgsql数据库中如何更新表中某个字段的值等于另一个关联表中的一个字段值呢?
2.21K 次浏览
1 个回答
-
要在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)