Sql 更新中间表

Sql 更新中间表,sql,postgresql,Sql,Postgresql,关于如何创建和更新中间表,我有两个问题。例如,我有两个表,学生和科目模块,它们具有多对多关系,它们看起来如下: student class student_id student_name class_id class_name 1 John 1 Economics 2 Mary 2

关于如何创建和更新中间表,我有两个问题。例如,我有两个表,学生和科目模块,它们具有多对多关系,它们看起来如下:

student                             class
student_id student_name             class_id class_name
1          John                     1        Economics
2          Mary                     2        Physics
insert into studentclasses (student_id, class_id)
    select s.student_id, c.class_id
    from (values ('John', 'Physics'),
                 ('Mary', 'Economics'),
                 ('Mary', 'Physics')
         ) v(student_name, class_name) join
         student s
         on s.student_name = v.student_name join
         class c
         on c.class_name = v.class_id;
中间表如下所示,其中John只上物理课,而Mary同时上物理课和经济学课:

studentclasses
id student_id class_id
1  1          2
2  2          1
3  2          2
我的第一个问题是:因为学生表和班级表都很小,所以我可以手动创建中间表。在处理较大的数据集时,如何创建中间表

我的第二个问题:如果我想收到一个包含所有信息的新条目,即
学生姓名、学生班级
,那么我如何将这个新条目更新到我的中间表中


另外,我正在使用Postgresql,我想你想要这样的东西:

student                             class
student_id student_name             class_id class_name
1          John                     1        Economics
2          Mary                     2        Physics
insert into studentclasses (student_id, class_id)
    select s.student_id, c.class_id
    from (values ('John', 'Physics'),
                 ('Mary', 'Economics'),
                 ('Mary', 'Physics')
         ) v(student_name, class_name) join
         student s
         on s.student_name = v.student_name join
         class c
         on c.class_name = v.class_id;
也就是说,您有一个学生名/类名对的来源。在这个查询中,它由
values()
语句提供。然后,您可以
加入到相应的表中,以获得所需的ID


当然,如果您知道要开始使用的ID,则无需加入。您可以直接插入到表中。

我想您需要这样的内容:

student                             class
student_id student_name             class_id class_name
1          John                     1        Economics
2          Mary                     2        Physics
insert into studentclasses (student_id, class_id)
    select s.student_id, c.class_id
    from (values ('John', 'Physics'),
                 ('Mary', 'Economics'),
                 ('Mary', 'Physics')
         ) v(student_name, class_name) join
         student s
         on s.student_name = v.student_name join
         class c
         on c.class_name = v.class_id;
也就是说,您有一个学生名/类名对的来源。在这个查询中,它由
values()
语句提供。然后,您可以
加入到相应的表中,以获得所需的ID


当然,如果您知道要开始使用的ID,则无需加入。您可以直接插入表格。

是的,我想这就是我想要的。为了澄清一下,因为我刚刚开始学习sql,所以我可以用一个包含所有对的表来替换values()语句,对吗?@JasonTay。是的,你能做到。是的,我想这就是我想要的。为了澄清一下,因为我刚刚开始学习sql,所以我可以用一个包含所有对的表来替换values()语句,对吗?@JasonTay。是的,你能做到。