mysql - Mysql:标记从转储表中插入的行
问题描述
我有一个由批量插入数据填充的转储表,我想按分类将它们隔离在其他表上。
这是我的转储表,其中包含从文本文件中提取的数据。
==========================DUMP===============================
| Employee Name | Company | Family Tree Name | Relationship |
=============================================================
| Bryan Fury | Guugle | Jenny Fury | Wife |
| | | Peter Fury | Son |
| | | Mary Fury | Daughter |
| Paul Pheonix | Soony | Linda Phoenix | Wife |
| | | Peter Phoenix | Son |
| | | John Phoenix | Son |
| Gwen Zamora | Aple | Sebastian Zamora | Husband |
| | | Ryan Zamora | Son |
=============================================================
我想用这样的标识符将它们分成两个表
================EMPLOYEE===============
| Employee Name | Company | Tagging |
=======================================
| Bryan Fury | Guugle | Family 1 |
| Paul Pheonix | Soony | Family 2 |
| Gwen Zamora | Aple | Family 3 |
=======================================
==============FAMILY TREE===================
| Name | Relationship| Tagging |
============================================
| Jenny Fury | Wife | Family 1 |
| Peter Fury | Son | Family 1 |
| Mary Fury | Daughter | Family 1 |
| Linda Phoenix | Wife | Family 2 |
| Peter Phoenix | Son | Family 2 |
| John Phoenix | Son | Family 2 |
| Sebastian Zamora| Husband | Family 3 |
| Ryan Zamora | Son | Family 3 |
============================================
解决方案
经典的“标准化”。
假设这些是所需的两个表:
CREATE TABLE Employee (
family_id INT UNSIGNED AUTO_INCREMENT,
name ...,
company ...,
PRIMARY KEY(id)
) ENGINE=InnoDB;
CREATE TABLE FamilyTree (
id INT UNSIGNED AUTO_INCREMENT,
family_id INT UNSIGNED,
name ...,
relationship ...,
PRIMARY KEY(id)
) ENGINE=InnoDB;
这是填充它们的 SQL:
-- Create ids for each "family" (`id` will be automatically set):
INSERT INTO Employee (name, company)
SELECT DISTINCT employee_name, company
FROM Dump;
-- Build the other table:
INSERT INTO FamilyTree (name, relationship, family_id)
SELECT d.family_tree_name, d.relationship,
e.family_id
FROM Employee AS e
JOIN Dump AS d ON d.employee_name = e.name
AND d.company = e.company;
这需要更少的输入,并且是使用 SQL 的一个很好的教训,而不是在编程语言中繁琐地编写类似 SQL 的操作。
如果有裙带关系,你就有问题了。
推荐阅读
- c++ - 未从实时 ETW 消费者接收 Microsoft-Windows-Kernel-Process 事件
- scala - sbt 未显示“runMain”的完整输出
- node.js - 反应
ProtectedRoute 问题/无法按预期工作 - java - 正则表达式只允许给定字符类中的一个(可能是重复的)字符
- html - 来自 HTML 文档中嵌入的 typeform 的“unsafe-eval”错误 Google App Engine 托管
- python - 如何格式化我的 y 轴以在 Seaborn 图表中显示逗号分隔符?
- c# - 创建一个新的 .txt 文件,而不是在 C# 中追加
- angular - 使用 Docker 在 nginx 服务器上部署 Angular 应用程序 欢迎使用 nginx
- ios - maxKeyCount 和 addPositiveDiagnosisKeys 如何交互?
- javascript - 对象过滤器功能在我的代码中向后工作