根据其他表中的列值更新外键ID

时间:2014-08-26 22:49:15

标签: sql database postgresql sql-update

我的PostgreSQL数据库中有4个表:classlessonsubjectterm

\ d class

  Column     |  Type   |                           Modifiers                           
---------------+---------+---------------------------------------------------------------
id           | integer | not null default nextval('class_id_seq'::regclass)
subject_id   | integer | not null
term_id      | integer | not null

Indexes:
    "class_pkey" PRIMARY KEY, btree (id)
    "class_subject_id_term_id_key" UNIQUE CONSTRAINT, btree (subject_id, term_id)
    "class_subject_id" btree (subject_id)
    "class_term_id" btree (term_id)
Foreign-key constraints:
    "class_subject_id_fkey" FOREIGN KEY (subject_id) REFERENCES subject(id) DEFERRABLE INITIALLY DEFERRED
    "class_term_id_fkey" FOREIGN KEY (term_id) REFERENCES term(id) DEFERRABLE INITIALLY DEFERRED
Referenced by:
    TABLE "lesson" CONSTRAINT "lesson_class_id_fkey" FOREIGN KEY (class_id) REFERENCES class(id) DEFERRABLE INITIALLY DEFERRED

\ d lesson

   Column    |         Type         |                          Modifiers                          
--------------+----------------------+-------------------------------------------------------------
id           | integer              | not null default nextval('lesson_id_seq'::regclass)
class_id     | integer              | not null

Indexes:
    "lesson_pkey" PRIMARY KEY, btree (id)
    "lesson_class_id" btree (class_id)
Foreign-key constraints:
    "lesson_class_id_fkey" FOREIGN KEY (class_id) REFERENCES class(id) DEFERRABLE INITIALLY DEFERRED

\ d subject

    Column     |         Type          |                             Modifiers                             
----------------+-----------------------+-------------------------------------------------------------------
id             | integer               | not null default nextval('subject_id_seq'::regclass)
name           | character varying(50) | not null 

Indexes:
    "subject_pkey" PRIMARY KEY, btree (id)   
Referenced by:
    TABLE "class" CONSTRAINT "class_subject_id_fkey" FOREIGN KEY (subject_id) REFERENCES subject(id) DEFERRABLE INITIALLY DEFERRED

\ d term

 Column  |         Type         |                          Modifiers                           
----------+----------------------+--------------------------------------------------------------
id       | integer              | not null default nextval('term_id_seq'::regclass)
year     | integer              | not null
semester | character varying(1) | not null

Indexes:
    "term_pkey" PRIMARY KEY, btree (id)
    "term_year_semester_key" UNIQUE CONSTRAINT, btree (year, semester)
Referenced by:
    TABLE "class" CONSTRAINT "class_term_id_fkey" FOREIGN KEY (term_id) REFERENCES term(id) DEFERRABLE INITIALLY DEFERRED

我在课堂上填写了课程,课程和#39;和科目'这个术语的数据,手动。然而,在下学期,我必须更新课程'信息,创建相同的类(它们具有相同的主题)但引用新术语。我设法通过插入课程来实现这一目标。临时表上的数据,更新术语并将其插回原始表。但是现在,新课程有了新的标识来识别它们。是否有一种自动方式可以更新课程表中的外键值以引用新类?

我使用了这段SQL代码,但是,正如你所看到的,我需要自己指定类和主题id。由于我有很多课程和课程,特定科目,我想要进行一些自动更新或迭代。表 lesson2 是临时表,其内容与课程相同:

update lesson2 set class_id = (
    select c.id from class c where c.id in (
        select id from class c where subject_id = 7) 
        and c.id <> class_id
    ) 
    where class_id = 12;

也就是说,在 class 表中,对于一个特定的主题,我有四行,如:

id   subject_id     term_id
3    7              2
5    10             2

id     subject_id   term_id
210    7            3
211    10           3

lesson2 表中,我有3行,如:

id    class_id
15    3           ...
16    5          ...
17    3           ...

如何自动更新第一行和第三行:

id    class_id
15    210      ...
16    211      ...
17    210      ...

之后,我将重新插入原始课程表中的数据,不包括id列。

1 个答案:

答案 0 :(得分:0)

你不想做你说你想做的事。

以下是我阅读数据的方式: 术语定义会话,例如学期或季度。秋季学期:2013年。春季学期:2014年等 一门学科是具体的学习课程:代数,初级钢琴,西方文明101。 类定义术语中处理的每个主题的实例。代数可以在上午10点播放MWF一小时,TTh在下午3点播放1.5小时,在星期六上午10点播放3小时。 一堂课是......班级的每个(可分级)分班?你确定不应该受到影响吗? MWF代数课程的课程与TTh代数课程不同吗?这是可能的。取决于你要遗漏的其他属性。

无论哪种方式,下一学期开始。您输入新的术语行。您输入新课程。只有当您的学校添加了新科目或不再教授科目时,您才会更改科目。课程与课程相关联,因此您必须为每个新课程输入新课程。如果课程与科目相关联,那么它们就不会改变 - 除非你重新组织学科的教学方式。但是无法更改以前类所引用的现有课程。这些课程属于这些课程。新课程必须自己上课。

这可能不是您想要做的,但它是您设计架构的方式。数据库明智地让你很难违反自己的设计。好数据库!

在设计了特定架构之后,通过它“走”一些代表性数据,看看它是否真的是你想要发生的。在一个设计良好的数据库中,数据应该就位,就像Leggos一样,在你想要它的地方,很少或根本没有努力。它会去它所属的地方。如果你发现自己在与数据作斗争,那你就搞砸了。备份并重试。

相关问题