【发布时间】:2014-05-05 05:23:01
【问题描述】:
在 MYSQL 数据库中,我需要为多对多关系创建一个新的联结表,以反映关系中的一个表具有两列复合主键这一事实。 如何编写 SQL 来完成此操作?
这是当前的表结构:
wordkeys
keyword (pk)
description
id
effectiveTime
other columns
primary key (id, effectiveTime)
oldjunction
keyword (fk to wordkeys)
descriptionid (fk to description)//this needs to change to add effectiveTime
primary key (keyword, descriptionid)//this needs to change to add effectiveTime
newjunction (need to create this table as a function of the others above)
keyword (fk to wordkeys table)
descriptionid
effectiveTime
primary key (keyword, descriptionid, effectiveTime)
foreign key (descriptionid, effectiveTime) to description table
SQL需要完成以下工作:
FOR EACH row in oldjunction
1.) get all the values of effectiveTime associated with the given descriptionid from that row
2.) FOR EACH value of effectiveTime from step 1, create a new row in newjunction table
编辑:
针对cmets,我添加更多信息如下:
我需要帮助将我上面原始帖子的FOR EACH 组件翻译成 SQL 语法。这将需要创建newjunction 表。我们需要newjunction 表的原因是descriptionid 本身并不能唯一标识description 表中的各个行。相反,我们需要descriptionid 和effectiveTime 的组合,以便为description 表中的每一行获取唯一标识符。这是否说明了问题?
【问题讨论】:
-
复合键是您面临的主要问题吗?您将如何使用旧的非复合键编写您正在寻找的 SQL?应该很容易从那里拿走它。
-
到目前为止你有什么问题,正在给你带来麻烦?你似乎已经开始分解问题了。 ...虽然,我会犹豫将
effectiveTime放在交叉引用表中。通过包含它试图完成什么?将 all 行放入新表中提供的关系与仅链接到id时获得的关系相同。如果您想说关系是按时间键控的,那么您需要从description表中删除effectiveTime。 -
@Clockwork-Muse 请参阅我上面原始帖子的附录。我遇到了问题,因为
descriptionid没有唯一标识description表中的每一行。另外,我需要帮助将伪代码翻译成创建newjunction表所需的SQL。我不知道如何将所有FOR EACH的东西翻译成sql。你能帮忙吗? -
@JanickBernet 我在线,如果您现在愿意帮助我,我可以及时回复。
-
不,我的意思是:在交叉引用表中包含一列的唯一原因是它会在关系中产生差异。两个表中的唯一性都无关紧要。这就是我担心的原因 - 您要引入 每一行 行,这意味着
effectiveTime在那里并不是真正有用的信息。展望未来,您会将effective time的所有新实例都带入连接表吗?然后将其包含在交叉引用表中是没有意义的。你想通过这样做来获得什么好处?您不必引用外键中的所有列...