0

mysql データベースに取り込む必要がある CSV ファイルのグループがいくつかあります。CSV は次のとおりです。

Products (product_id を持っています) ShippingDetails (product_id を介して製品の csv ファイルに関連しています) Categories (product_id を介して製品の csv ファイルに関連しています)

これらのファイルの 3 つのグループがあります

グループ 1: Products1.csv、ShippingDetails1.csv、Categories1.csv Products2.csv、ShippingDetail2.csv、... ...

各グループのファイルは、product_id で関連付けられます。

問題は、データベース内のファイルのすべてのグループをロードしたいのですが、product_id の ID が各グループで 0 から始まることです。そのため、どの csv ファイルからでも、すべての製品で一意になるように ID を変更する方法が必要です。また、すべてのデータが単一のテーブルに取り込まれるときに、各グループの関係 (外部キー) を変更して、新しい一意の ID と一致させる必要があります。実際のシナリオでは、各グループの product_id にすべて関連付けられた一連のテーブルがあります。だから私は、MySQL が外出先で関係を修正できるかどうか、またはそれを行うための最良の方法は何かと思っていました。

4

1 に答える 1

0

MySQL でそれができるかどうかはわかりませんが、簡単なスクリプトで実行できます。たとえば PHP では、データベース内のテーブル products と shipping_details が空であると仮定します。

$group_count = 3;

mysql_connect(DB_HOST, DB_USER, DB_PASS);
mysql_select_db(DB_NAME);

for ($max_product_id = 0, $group = 1; $group <= $group_count; $group++)
{
    // create temporary tables
    mysql_query("CREATE TABLE products_tmp LIKE products");
    mysql_query("CREATE TABLE shipping_details_tmp LIKE shipping_details");

    // load data from csv files
    mysql_query("LOAD DATA INFILE 'Products$group.csv' INTO TABLE products_tmp");
    mysql_query("LOAD DATA INFILE 'ShippingDetails$group.csv' INTO TABLE shipping_details_tmp");

    // update unique ids
    mysql_query("UPDATE products_tmp SET product_id = product_id + $max_product_id");
    mysql_query("UPDATE shipping_details_tmp SET product_id = product_id + $max_product_id");

    // insert into final tables
    mysql_query("INSERT INTO products SELECT * FROM products_tmp");
    mysql_query("INSERT INTO shipping_details SELECT * FROM shipping_details_tmp");

    // drop temporary tables
    mysql_query("DROP TABLE products_tmp");
    mysql_query("DROP TABLE shipping_details_tmp");

    // get max product_id to update next group of data
    list($max_product_id) = mysql_fetch_row(mysql_query("SELECT MAX(product_id)+1 FROM products"));
}

このコードのロジックは、最初のデータ グループをテーブルに挿入し、最大 product_id + 1 を取得し、次のデータ グループを挿入する前に、その数値をすべての product_id に追加することです。そうすれば、product_id は常に一意になり、関係が維持されます。サンプル コードでは 2 つのテーブルを使用しましたが、これを必要な数のテーブルに拡張できます。

ノート:

  • csv ファイルからデータをロードする場合 (LOAD DATA INFILE... を使用)、ファイルへの絶対パスを指定する必要があります。私はコードをきれいに保つためにそうしませんでした。
  • 記述が簡単なので古い mysql 関数を使用しましたが、本番コードでは PDO のようなものを使用する方が適切です。
于 2012-05-09T03:15:41.010 に答える