4

在现有的 web 应用程序(PHP/MySQL)上工作,我来到了这一点:我有 2 个存储名称和类型 id 的表。它们之间的关系是 N<---->NI 之间还有另一个表。(见图)

表名和列已被简化,但差不多就是这样

我有一个名为“类别”的最后一张桌子,没有图片。我要做的是:将具有 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”字段自动递增,一切正常)。

但是关于复制关系,我不知道如何解决这个问题。

附加信息:

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

1 回答 1

0

你说你不能改变表结构。如果可以的话,我可能会建议根据您在做什么,不要对这些表进行非规范化(行的重复)。

我也有点困惑,因为你说你必须复制行和关系id_category = 1to id_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();
于 2012-09-18T13:35:12.013 回答