如何使用映射将数据从登台插入到多个表中

时间:2017-12-06 11:04:56

标签: mysql denormalization

我想要的是在mysql表中插入数据,但我无法找到从一行建立关系的方法

我有一个临时表,其数据如下:

            staging_table
+-----------+-------------------+-----------+-------------------+-----------+-------------------+-----------+-------------------+
|  p_name   |      p_details    |  child_1  |  child_details_1  |  child_2  |  child_details_2  |  child_3  |  child_details_3  |
+-----------+-------------------+-----------+-------------------+-----------+-------------------+-----------+-------------------+
|  parent_1 |  parent_details_1 | child_1.1 | child_details_1.1 | child_1.2 | child_details_1.2 |           |                   |
|  parent_2 |  parent_details_2 | child_2.1 | child_details_2.1 |           |                   |           |                   |
|  parent_3 |  parent_details_3 | child_3.1 | child_details_3.1 | child_3.2 | child_details_3.2 | child_3.3 | child_details_3.3 |
+-----------+-------------------+-----------+-------------------+-----------+-------------------+-----------+-------------------+

我想要实现的是在两个表中插入数据,如

            parent_table
+---+-----------+-------------------+
|id |   name    |      details      |
+---+-----------+-------------------+
| 1 |  parent_1 |  parent_details_1 |
| 2 |  parent_2 |  parent_details_2 |
| 3 |  parent_3 |  parent_details_3 |
+---+-----------+-------------------+


              child_table
+---+-----+-----------+-------------------+
|id | pid |   name    |      details      |
+---+-----+-----------+-------------------+
| 1 |  1  | child_1.1 | child_details_1.1 |
| 2 |  1  | child_1.2 | child_details_1.2 |
| 3 |  2  | child_2.1 | child_details_2.1 |
| 4 |  3  | child_3.1 | child_details_3.1 |
| 5 |  3  | child_3.2 | child_details_3.2 |
| 6 |  3  | child_3.3 | child_details_3.3 |
+---+-----+-----------+-------------------+

前两列用于父级,之后两列属于子级。所以我必须在子表中插入子数据,但如果它只插入数据,如果列的值不是null。

我试过了。 if声明,但无法建立关系

但我接下来做什么我不知道。

1 个答案:

答案 0 :(得分:0)

如何填充父表格应该很明显:

INSERT INTO parent_table (name, details)  
SELECT p_name name, p_details details FROM staging_table;

子表可以创建相同的方式,但可以使用三对列的联合

INSERT INTO child_table (pid, name, details)
SELECT p.id pid, child_1 name, child_details_1 details
  FROM staging_table s
  JOIN parent_table p ON s.p_name = p.name AND s.p_details = p.details
 WHERE child_1 IS NOT NULL 
   AND child_details_1 IS NOT NULL

 UNION ALL

SELECT p.id pid, child_2 name, child_details_2 details
  FROM staging_table s
  JOIN parent_table p ON s.p_name = p.name AND s.p_details = p.details
 WHERE child_2 IS NOT NULL 
   AND child_details_2 IS NOT NULL

 UNION ALL

SELECT p.id pid, child_3 name, child_details_3 details
  FROM staging_table s
  JOIN parent_table p ON s.p_name = p.name AND s.p_details = p.details
 WHERE child_3 IS NOT NULL 
   AND child_details_3 IS NOT NULL;

查看查询的三个重复部分?这就是你处理非规范化输入表的方法。

请参阅JOIN ... ON ..条款?这就是您将pid值添加到child_table中的方法。

我没有调试过这个。