Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 创建一个新的联接表,以反映其中一个联接表中的两列主键_Mysql_Sql - Fatal编程技术网

Mysql 创建一个新的联接表,以反映其中一个联接表中的两列主键

Mysql 创建一个新的联接表,以反映其中一个联接表中的两列主键,mysql,sql,Mysql,Sql,在MYSQL数据库中,我需要为多对多关系创建一个新的连接表,以反映关系中的一个表具有两列复合主键这一事实如何编写SQL来实现这一点? 以下是当前的表结构: wordkeys keyword (pk) description id effectiveTime other columns primary key (id, effectiveTime) oldjunction keyword (fk to wordkeys)

在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

编辑:


针对这些评论,我补充了以下更多信息:


我需要帮助将以上原始帖子中每个组件的
翻译成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 to
wordkeys
表。

是复合键面临的主要问题吗?如何使用旧的非复合键编写所需的SQL?从那里开始应该很容易。到目前为止,你得到了什么,给你带来了什么问题?你似乎已经开始分解问题了。。。尽管如此,我还是不愿将
effectiveTime
放在交叉引用表中。我们试图通过包含它来实现什么?将所有行放入新表提供了与仅链接到
id
相同的关系。如果你想说关系是按时间键定的,那么你需要从
说明
表中删除
有效时间
。@Clockwork Muse请参阅我上面原始帖子的附录。我遇到问题是因为
descriptionid
不能唯一标识
description
表中的每一行。另外,我需要帮助将伪代码转换为创建
newjunction
表所需的SQL。我不知道如何将每个
东西的所有
翻译成sql。你能帮忙吗?@JanickBernet我在线,如果你现在愿意帮助我,我可以迅速回复。不,我的意思是:在交叉引用表中包含一列的唯一原因是它会改变关系。这两个表中的唯一性都无关紧要。这就是我担心的原因——你把每一行都带进来,这意味着
effectiveTime
并不是真正有用的信息。接下来,您是否会将
有效时间的所有新实例
放入联接表中?那么,将其包含在交叉引用表中是毫无意义的。你想通过这样做获得什么好处?您不必引用外键中的所有列…是的,我的意思是o,已修复。我将此标记为答案,因为查询导致连接表中的行数增加了20%,我假设这意味着每个表的所有唯一行现在都被连接表引用。不过,下次登录时,我将研究发条缪斯的建议。他似乎在说这种方法是有缺陷的。