Mysql 创建一个新的联接表,以反映其中一个联接表中的两列主键
在MYSQL数据库中,我需要为多对多关系创建一个新的连接表,以反映关系中的一个表具有两列复合主键这一事实如何编写SQL来实现这一点? 以下是当前的表结构:Mysql 创建一个新的联接表,以反映其中一个联接表中的两列主键,mysql,sql,Mysql,Sql,在MYSQL数据库中,我需要为多对多关系创建一个新的连接表,以反映关系中的一个表具有两列复合主键这一事实如何编写SQL来实现这一点? 以下是当前的表结构: wordkeys keyword (pk) description id effectiveTime other columns primary key (id, effectiveTime) oldjunction keyword (fk to wordkeys)
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
编辑:
针对这些评论,我补充了以下更多信息:
我需要帮助将以上原始帖子中每个组件的
翻译成SQL语法。这将需要创建newjunction
表。我们需要newjunction
表的原因是descriptionid
本身并不能唯一标识description
表中的各个行。相反,我们需要组合descriptionid
和effectiveTime
,以便为description
表中的每一行获取唯一标识符。这是否澄清了问题?因此,从我收集的信息来看,我认为您需要的是:
INSERT INTO newjunction
SELECT o.keyword, d.id, d.effectiveTime
FROM description d
JOIN oldjunction o
ON o.descriptionid = d.id
另外,我认为newjunction
缺少一个FK towordkeys
表。是复合键面临的主要问题吗?如何使用旧的非复合键编写所需的SQL?从那里开始应该很容易。到目前为止,你得到了什么,给你带来了什么问题?你似乎已经开始分解问题了。。。尽管如此,我还是不愿将effectiveTime
放在交叉引用表中。我们试图通过包含它来实现什么?将所有行放入新表提供了与仅链接到id
相同的关系。如果你想说关系是按时间键定的,那么你需要从说明表中删除有效时间。@Clockwork Muse请参阅我上面原始帖子的附录。我遇到问题是因为descriptionid
不能唯一标识description
表中的每一行。另外,我需要帮助将伪代码转换为创建newjunction
表所需的SQL。我不知道如何将每个
东西的所有翻译成sql。你能帮忙吗?@JanickBernet我在线,如果你现在愿意帮助我,我可以迅速回复。不,我的意思是:在交叉引用表中包含一列的唯一原因是它会改变关系。这两个表中的唯一性都无关紧要。这就是我担心的原因——你把每一行都带进来,这意味着effectiveTime
并不是真正有用的信息。接下来,您是否会将有效时间的所有新实例
放入联接表中?那么,将其包含在交叉引用表中是毫无意义的。你想通过这样做获得什么好处?您不必引用外键中的所有列…是的,我的意思是o,已修复。我将此标记为答案,因为查询导致连接表中的行数增加了20%,我假设这意味着每个表的所有唯一行现在都被连接表引用。不过,下次登录时,我将研究发条缪斯的建议。他似乎在说这种方法是有缺陷的。