使用关系复制数据库记录

时间:2011-01-23 17:26:06

标签: mysql symfony1 doctrine

我在同一个数据库中有两组表 - 一个实时集和一个测试集。每个集合中都有两个表 - 表A和表B - 它们之间具有一对多的关系。

我需要做的是从测试集中的表A中选择某些记录,并将整个记录及其在表B中的关系复制到实时表集中。集合的结构是相同的。

是否可以在不必手动打破记录的情况下执行此操作?

我在symfony 1.4 PHP框架的上下文中使用了学说ORM(1.2我认为)。

到目前为止,我一直在尝试这样的事情:

$record = Doctrine_Core::getTable('testSetTableA')->find(1);
$liveSetTableArecord = new LiveSetTableArecord();
$liveSetTableArecord = $record->copy();
$liveSetTableArecord->save();

但我觉得我错过了一些基本的东西。据我所知,没有办法从查询对象中完整地设置记录?

1 个答案:

答案 0 :(得分:2)

我对这个问题做了更多的研究,据我所知,使用ORM进行这种操作首先是一个坏主意,因为所涉及的所有不必要的开销。

使用原始的“INSERT INTO”语句会更有效率,这正是我现在所做的。

    $connection = Doctrine_Manager::connection();
    $query = "INSERT INTO Set2tableA SELECT * FROM Set1tableA WHERE id = '$id' ON DUPLICATE KEY UPDATE Set2tableA.id = Set2tableA.id";
    $statement = $connection->execute($query);
    $statement->execute();

    $query2 = "INSERT INTO Set2TableB SELECT * FROM Set1TableB WHERE tableA_id = '$id' ON DUPLICATE KEY UPDATE Set2TableB.id = Set1TableB.id";
    $statement = $connection->execute($query2);
    $statement->execute();

'ON DUPLICATE KEY UPDATE'是必要的,因为表B中的主键是非空的,因此当您尝试将表A中的记录1复制到表B时,mysql发现已经存在ID = 1的条目并抛出错误。