0

我有几组 CSV 文件需要放入 mysql 数据库。CSV 如下:

Products(它有一个 product_id) ShippingDetails(通过 product_id 与产品 csv 文件相关) Categories(通过 product_id 与产品 csv 文件相关)

我有 3 组这些文件

Group1: Products1.csv, ShippingDetails1.csv, Categories1.csv Products2.csv, ShippingDetail2.csv, ... ...

每个组上的文件都与 product_id 关联。

问题是我想加载数据库中的所有文件组,但是 product_id 的 id 在每个组上从 0 开始。所以我需要一种方法来更改 id,以便它对所有产品都是唯一的,无论它来自什么 csv 文件。此外,当所有数据都被带到一个表中时,我需要更改每个组上的关系(外键)以使它们与新的唯一 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 回答