【问题标题】:Copy Data from one column to another column in a different table using MySQL使用 MySQL 将数据从一列复制到不同表中的另一列
【发布时间】:2014-08-30 15:30:22
【问题描述】:

我正在尝试使用 MySQL 将数据从一列复制到另一个表中的另一列,但我要导入的表有一个外键限制,阻止我这样做;

这是我要从 (product_code) 列导入的表

表1

+----+--------------+-------------+-------+--------------+-----------+---------+-------+-------+
| id | product_code | distributor | brand | productname  | wheelsize | pcd_1   | pcd_2 | pcd_3 |
+----+--------------+-------------+-------+--------------+-----------+---------+-------+-------+
|  1 | F7050MHS20A2 | *******     | MAK   | MOHAVE       | 7 x 15    | 5x139.7 |       |       |
|  2 | 3480         | *******     | KFZ   | Winter Steel | 4.5 x 13  | 3x98    |       |       |
|  3 | 3480         | *******     | KFZ   | Winter Steel | 4.5 x 13  | 3x98    |       |       |
|  4 | 3480         | *******     | KFZ   | Winter Steel | 4.5 x 13  | 3x98    |       |       |
|  5 | 3480         | *******     | KFZ   | Winter Steel | 4.5 x 13  | 3x98    |       |       |
|  6 | 3480         | *******     | KFZ   | Winter Steel | 4.5 x 13  | 3x98    |       |       |
|  7 | 3480         | *******     | KFZ   | Winter Steel | 4.5 x 13  | 3x98    |       |       |
|  8 | 3480         | *******     | KFZ   | Winter Steel | 4.5 x 13  | 3x98    |       |       |
|  9 | 3480         | *******     | KFZ   | Winter Steel | 4.5 x 13  | 3x98    |       |       |
| 10 | 3480         | *******     | KFZ   | Winter Steel | 4.5 x 13  | 3x98    |       |       |
+----+--------------+-------------+-------+--------------+-----------+---------+-------+-------+

我想将product_code 列复制到sku 列中

表2

+----------+----------+-------+--------------+
| id       | value_id | pid   | sku          |
+----------+----------+-------+--------------+
| 20315857 |   369781 | 41257 | 001          |
| 20315858 |   369782 | 41256 | Config - ST5 |
+----------+----------+-------+--------------+

问题是 Table2 中的 value_id 列引用了 value_id Table3 所以我要么得到一个 Foreign key restraint error 要么 lock wait timeout

 a foreign key constraint fails (`gravytra_topgear`.`am_finder_map`, CONSTRAINT `FK_MAP_VALUE` FOREIGN KEY (`value_id`) REFERENCES `am_finder_value` (`value_id`) ON D

表 3

+----------+-----------+-------------+----------------+
| value_id | parent_id | dropdown_id | name           |
+----------+-----------+-------------+----------------+
|     6771 |         0 |           4 | AC             |
|     6749 |         0 |           4 | Acura USA      |
|     6895 |         0 |           4 | Aixam          |
|     6872 |         0 |           4 | Alfa Romeo     |
|     6853 |         0 |           4 | Alfa Romeo USA |
|     6772 |         0 |           4 | Alpina         |
|     6815 |         0 |           4 | AMC USA        |
|     6854 |         0 |           4 | Anhui Anchi    |
|     6928 |         0 |           4 | Ariel          |
|     6783 |         0 |           4 | ARO            |
+----------+-----------+-------------+----------------+

这是我的查询

INSERT INTO table2 (sku) SELECT product_code FROM table1;

table1 product_code 列中有超过 200 万条记录,导致我的服务器在查询期间崩溃。

我知道必须有更好的方法来做到这一点,但我不知道该怎么做,所以如果可能的话希望得到一些帮助...?

【问题讨论】:

  • 您选择一个字段并插入三个。两者的字段数需要匹配。
  • “我需要将这些放在table_1的名称列中”请解释一下???

标签: mysql sql


【解决方案1】:

对我来说,您的查询看起来不错。

尝试使用 where 子句中的某个 id 或在 select 中使用 limit 将“插入 - 选择”分成几部分。

插入 100 条记录。看看情况如何。检查你的 time_out 变量。如果需要,相应增加。

【讨论】:

  • 感谢您的鼓励 cmets,问题是外键约束 ` 外键约束失败 (gravytra_topgear.am_finder_map, CONSTRAINT FK_MAP_VALUE FOREIGN KEY (value_id) 参考@987654325 @ (value_id) ON D`
  • 您似乎知道如何解决此问题。
  • 老兄,我不确定我需要进行哪个查询才能更新父项
【解决方案2】:

您正在尝试将许多不同的列插入table_1,但您没有从第一个表中选择这些列。因此,当您应该插入 4 时,您正在插入一列。我认为您正在寻找的是:

INSERT INTO table_1(name) SELECT firstname FROM table_2;


如果您想为其他 3 列设置默认值,您也可以轻松地将它们放入选择查询中:

INSERT INTO table_1(value_id, parent_id, dropdown_id, name) 
  SELECT  default_id, default_parent_id, default_dropdown_id, firstname
  FROM table_2;

只需将 default_ id 替换为您自己的默认值,无论它们是什么。

【讨论】:

    【解决方案3】:

    修复很简单,

    只需将查询包装在里面:

    SET AUTOCOMMIT = 0;
    SET FOREIGN_KEY_CHECKS = 0;
    SET UNIQUE_CHECKS = 0;
    
    # YOUR QUERIES HERE...
    
    SET AUTOCOMMIT = 1;
    SET FOREIGN_KEY_CHECKS = 1;
    SET UNIQUE_CHECKS = 1;
    

    数据进入,唯一的困难是数据集的大小,但将其分成块有很大帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 2011-09-12
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      相关资源
      最近更新 更多