我的PostgreSQL数据库中有4个表:class
,lesson
,subject
和term
。
\ 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列。
答案 0 :(得分:0)
你不想做你说你想做的事。
以下是我阅读数据的方式: 术语定义会话,例如学期或季度。秋季学期:2013年。春季学期:2014年等 一门学科是具体的学习课程:代数,初级钢琴,西方文明101。 类定义术语中处理的每个主题的实例。代数可以在上午10点播放MWF一小时,TTh在下午3点播放1.5小时,在星期六上午10点播放3小时。 一堂课是......班级的每个(可分级)分班?你确定不应该受到影响吗? MWF代数课程的课程与TTh代数课程不同吗?这是可能的。取决于你要遗漏的其他属性。
无论哪种方式,下一学期开始。您输入新的术语行。您输入新课程。只有当您的学校添加了新科目或不再教授科目时,您才会更改科目。课程与课程相关联,因此您必须为每个新课程输入新课程。如果课程与科目相关联,那么它们就不会改变 - 除非你重新组织学科的教学方式。但是无法更改以前类所引用的现有课程。这些课程属于这些课程。新课程必须自己上课。
这可能不是您想要做的,但它是您设计架构的方式。数据库明智地让你很难违反自己的设计。好数据库!
在设计了特定架构之后,通过它“走”一些代表性数据,看看它是否真的是你想要发生的。在一个设计良好的数据库中,数据应该就位,就像Leggos一样,在你想要它的地方,很少或根本没有努力。它会去它所属的地方。如果你发现自己在与数据作斗争,那你就搞砸了。备份并重试。