在表,子表和子子表中复制行的最简单方法

时间:2010-09-07 17:44:16

标签: php sql mysql database

我正在为使用MySQL的小型网络应用程序实现“另存为副本”功能。

假设我有三张桌子,就像这样...

TABLE Doc
 ID,
 title,
 text

TABLE DocAttributes
 ID,
 DocID -> Doc(ID)
 title,
 text

TABLE DocSubAttributes
 DocAttrID -> DocAttributes(ID)
 title,
 text

我们这里的情况是单个Document可以有多个DocAttributes,而每个DocAttribute又可以有多个SubAttributes。

现在,如果我不必担心DocSubAttributes表,这将是相当简单的,我会做这样的事情......

$insertID = INSERT INTO Doc (title, text) SELECT title, text FROM Doc WHERE ID = $docID;

INSERT INTO DocAttributes DocID, title, text SELECT $insertID AS DocID, title, text FROM Doc WHERE ID = $docID;

但是,因为有第三个一对多表,所以此方法不起作用。我需要知道每个DocAttributes行的主键,以便在DocSubAttributes中创建相应的行。

我知道这样做的唯一方法是一次迭代一行DocAttributes,每次迭代选择所有DocSubAttributes,然后迭代地一次一个地执行每个插入。

我想知道:有没有更简单的方法在各自的表中复制这些行来创建一个全新的独立数据实体而不依赖于迭代?

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

如果您愿意将ID字段添加到链接回主记录的表中,您应该能够通过三个INSERT查询完成它(最后一个查询将有一个JOIN来获取新的ID)。

答案 1 :(得分:0)

您可以在插入之前制作自己的主键,例如

$uniqueKey = md5($ID . $title . $text);

并将其作为DocAttributes主键(ID)插入,您现在知道并用于插入DocSubAttributes