具有N:M关系的重复表(包括关系)

时间:2012-09-18 12:53:12

标签: php mysql database duplication database-relations

使用现有的webapp(PHP / MySQL)我来到这一步: 我有2个表存储名称和类型ID。它们之间的关系是N< ----> N我之间有另一个表。 (见图)

Tables names and columns have been simplified, but it's pretty much it

我有一张名为“类别”的最后一张表,它没有被提及。我要做的是: 具有相同值的合同和客户具有id_category = 1的重复合同和客户,id_category = 3。以及重复它们之间的关系

到目前为止,我已设法将所有合同和客户分开复制,使用:

INSERT INTO contract (t_name, id_category) SELECT t_name,'3' WHERE id_category=2
INSERT INTO customer (t_name, id_category) SELECT t_name,'3' WHERE id_category=2

(“id”字段为自动增量,一切正常。)

但是关于复制关系,我无法弄明白 HOW 来解决这个问题。

其他信息:

  • 使用临时表很好,但我不能修改现有的结构 表。
  • 合同可能有0到N个客户。客户可能有 从0到N合同。
  • 我可以使用严格的MySQL,也可以使用PHP。

1 个答案:

答案 0 :(得分:0)

你说你不能改变表结构。如果可以的话,我可能会建议不要使用这些表的非规范化(行重复)。

我也有点困惑,因为你说你必须复制id_category = 1id_category = 3的行和关系,但是你的示例查询有id_category = 2

但这个答案应该适用。我会使用PHP和PDO。

$pdo = new PDO('mysql:host=?', $user, $passwd);
$stmtCustomers = $pdo->prepare("INSERT INTO customer (t_name, id_category)
   VALUES (t_name, ?) WHERE id_category = ?");
$stmtContracts = $pdo->prepare("INSERT INTO contract (t_name, id_category)
   VALUES (t_name, ?) WHERE id_category = ?");
$stmtRelation = $pdo->prepare("INSERT INTO customer_has_contract VALUES (?, ?)");

//Perform in a loop if needed
$pdo->beginTransaction();
$stmtCustomers->execute($target_cat_id, $origin_cat_id);
$cus_id = $pdo->lastInsertId();
$stmtContracts->execute($target_cat_id, $origin_cat_id);
$con_id = $pdo->lastInsertId();
$stmtRelation->execute($con_id, $cus_id);
$pdo->commit();