我想要的是在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
声明,但无法建立关系
但我接下来做什么我不知道。
答案 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中的方法。
我没有调试过这个。