4

既存の webapp (PHP/MySQL) に取り組んでいるときに、この時点に到達しました。名前と型 ID を格納する 2 つのテーブルがあります。それらの間の関係は 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 = 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();
于 2012-09-18T13:35:12.013 に答える