SQL中交换一对多关系方向的最佳方法是什么?

时间:2010-09-10 10:06:31

标签: sql mysql relationship associations

好吧,无论出于何种原因,我最终遇到的情况是钥匙指向一对多的错误方式。它显然从来没有被用作一对多,只是作为一对一使用,现在需要将其中一个扩展为多个,并且密钥存储的方式结果是向后。

images表格包含target_idtarget_typetarget_column三条信息,用于识别任意数量的内容表。 target_type仅引用与图像关联的内容的表名。 target_column是用于查找图像的虚拟列(实际上不在内容表中)的名称。这使得任意内容都可以具有多个相关图像,每个图像具有不同的名称。

当您有一段内容并想要查找与特定名称相关联的图像时,您可以执行

select * from images where target_id = content.id 
    and target_type = "content" 
    and target_column = "image";

当您引用特定内容时,所有这些信息都可用。

我想要做的是反过来所有这些,以便图像表对引用它的特定内容片段一无所知,而是由每个内容表承担这种负担。

到目前为止,我知道我可以在内容表中添加一列,然后从images表中选择我需要的信息:

select id, target_id from images where target_type = "content";

我想要做的是将其用作子查询并对内容表进行批量更新。这样的事情可能吗?

update content set image_id = 
    (select id from images where target_type = "content") as image_ids where id =
    (select target_id from images where target_type = "content") as content_ids;

我知道这失败了,但我想做一些target_ids的质量分配回到image_ids。这是疯了吗?我该怎么做?

2 个答案:

答案 0 :(得分:2)

您可能希望使用Mysql多表更新机制。 (cf http://dev.mysql.com/doc/refman/5.0/en/update.html

在你的情况下,这将是

update
    content,
    images
set
    content.image_id = images.id
where
    images.target_id = content.id
    and images.target_type = 'content'
    and images.target_column = 'images'

我希望这会对你有所帮助

Jerome Wagner

答案 1 :(得分:1)

您可以加入图片表进行更新:

update content inner join images on images.target_id = content.id and 
    images.target_type = 'content' and images.target_column = 'images'
set content.image_id = images.id