【问题标题】:create a new junction table to reflect two column primary key in one of the joined tables创建一个新的联结表以反映其中一个联结表中的两列主键
【发布时间】: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 表中的各个行。相反,我们需要descriptionideffectiveTime 的组合,以便为description 表中的每一行获取唯一标识符。这是否说明了问题?

【问题讨论】:

  • 复合键是您面临的主要问题吗?您将如何使用旧的非复合键编写您正在寻找的 SQL?应该很容易从那里拿走它。
  • 到目前为止你有什么问题,正在给你带来麻烦?你似乎已经开始分解问题了。 ...虽然,我会犹豫将effectiveTime 放在交叉引用表中。通过包含它试图完成什么?将 all 行放入新表中提供的关系与仅链接到 id 时获得的关系相同。如果您想说关系是按时间键控的,那么您需要从 description 表中删除 effectiveTime
  • @Clockwork-Muse 请参阅我上面原始帖子的附录。我遇到了问题,因为descriptionid 没有唯一标识description 表中的每一行。另外,我需要帮助将伪代码翻译成创建newjunction 表所需的SQL。我不知道如何将所有FOR EACH 的东西翻译成sql。你能帮忙吗?
  • @JanickBernet 我在线,如果您现在愿意帮助我,我可以及时回复。
  • 不,我的意思是:在交叉引用表中包含一列的唯一原因是它会在关系中产生差异。两个表中的唯一性都无关紧要。这就是我担心的原因 - 您要引入 每一行 行,这意味着 effectiveTime 在那里并不是真正有用的信息。展望未来,您会将effective time 的所有新实例都带入连接表吗?然后将其包含在交叉引用表中是没有意义的。你想通过这样做来获得什么好处?您不必引用外键中的所有列...

标签: mysql sql


【解决方案1】:

所以从我收集的信息来看,我认为您正在寻找的是:

INSERT INTO newjunction 
SELECT o.keyword, d.id, d.effectiveTime
  FROM description d
  JOIN oldjunction o
    ON o.descriptionid = d.id

我还认为 newjunction 缺少指向 wordkeys 表的 FK。

【讨论】:

  • 是的,我的意思是 o,已修复。
  • 我将此标记为答案,因为查询导致联结表中的行数增加了 20%,我认为这意味着现在引用了每个表的所有唯一行由连接表。不过,下次登录时,我会考虑 Clockwork-Muse 的建议。他似乎在说这种方法是有缺陷的。
猜你喜欢
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
  • 2023-01-21
  • 1970-01-01
相关资源
最近更新 更多