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