Mysql 查询 - 从 CSV 条件插入以比较 table 和 CSV
Mysql query - insert from CSV conditional to comparison between table and CSV
我在 SQL 查询方面是个新手,不确定如何处理:
我有一个包含 5 列的 CSV 文件,其中 2 列是 Value1 和 Value2,我需要 运行 覆盖现有的 sql table(出于这个问题的目的,我将其称为"target table") 并遍历目标 table 中的所有行,检查它们的 Value1 列,如果 Value1 内容等于 CSV 中的内容,我需要将 Value2 插入该行的 Value2 列,如果 Value1 是未包含在 table 中,为其创建一个新行。
以防万一我不清楚,这里有一个例子 -
假设 CSV 如下所示:
Name, Age, Location, Height, Weight
David, 12, Macedonia, 1.87, 96
Kim, 15, Denmark, 1.95, 67
我想检查现有的 SQL 并仅根据姓名和体重工作 - 如果名字 David 在 table 中,则在其体重列中插入 96,如果名字 Kim在 table 中,将 67 插入其权重列等...
如果 table 只包含 Kim 而不是 David,则会创建 David 行。
我假设明智的方法是首先填补 table 中不存在的 "Value1" 的空白,然后才 运行 更新"Value2" 但我可能错了。
非常感谢任何帮助,谢谢!
理论上,我认为这对你有用。
--第 1 部分:Clear/Create 临时 table 并将 CSV 加载到 SQL。感谢 mr_eclair 描述了这个过程 here
drop table #temp
create table #temp (
tName nvarchar(25),
tAge int,
tLocation nvarchar(25),
tHeight float(3,2), -- alternatively, use cm instead of m and just use int(3)
tWeight int
)
BULK INSERT #temp
FROM 'C:\CSVData\updates.csv'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = ',', --CSV field delimiter
ROWTERMINATOR = '\n', --Use to shift the control to next row
TABLOCK
)
--第二部分:设置唯一键;正如@Yuri_Lachin
所建议的
Alter table target
Add Unique (Name) -- Sets Name column as a Unique Key for the table target
--第 3 部分:添加行并将值从临时 table 更新为永久 table。感谢 MySQL 5.7 参考手册 13.2.5.2
Insert into target(Name, Age, Location, Height, Weight)
Select tName, tAge, tLocation, tHeight, tWeight from #temp
On DUPLICATE KEY Update Weight = tWeight
我打算建议使用如下所示的 Merge 语句,但看起来 MySQL 不处理这些。
Merge Into people
using #temp
on target.name = #temp.tname
when matched then Update
set target.weight = #temp.tweight
when not matched then
Insert (target.name, target.age, target.location, target.height, target.weight)
values (#temp.tname, #temp.tage, #temp.tlocation, #temp.theight, #temp.tweight);
我在 SQL 查询方面是个新手,不确定如何处理: 我有一个包含 5 列的 CSV 文件,其中 2 列是 Value1 和 Value2,我需要 运行 覆盖现有的 sql table(出于这个问题的目的,我将其称为"target table") 并遍历目标 table 中的所有行,检查它们的 Value1 列,如果 Value1 内容等于 CSV 中的内容,我需要将 Value2 插入该行的 Value2 列,如果 Value1 是未包含在 table 中,为其创建一个新行。
以防万一我不清楚,这里有一个例子 -
假设 CSV 如下所示:
Name, Age, Location, Height, Weight
David, 12, Macedonia, 1.87, 96
Kim, 15, Denmark, 1.95, 67
我想检查现有的 SQL 并仅根据姓名和体重工作 - 如果名字 David 在 table 中,则在其体重列中插入 96,如果名字 Kim在 table 中,将 67 插入其权重列等... 如果 table 只包含 Kim 而不是 David,则会创建 David 行。
我假设明智的方法是首先填补 table 中不存在的 "Value1" 的空白,然后才 运行 更新"Value2" 但我可能错了。
非常感谢任何帮助,谢谢!
理论上,我认为这对你有用。
--第 1 部分:Clear/Create 临时 table 并将 CSV 加载到 SQL。感谢 mr_eclair 描述了这个过程 here
drop table #temp
create table #temp (
tName nvarchar(25),
tAge int,
tLocation nvarchar(25),
tHeight float(3,2), -- alternatively, use cm instead of m and just use int(3)
tWeight int
)
BULK INSERT #temp
FROM 'C:\CSVData\updates.csv'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = ',', --CSV field delimiter
ROWTERMINATOR = '\n', --Use to shift the control to next row
TABLOCK
)
--第二部分:设置唯一键;正如@Yuri_Lachin
所建议的Alter table target
Add Unique (Name) -- Sets Name column as a Unique Key for the table target
--第 3 部分:添加行并将值从临时 table 更新为永久 table。感谢 MySQL 5.7 参考手册 13.2.5.2
Insert into target(Name, Age, Location, Height, Weight)
Select tName, tAge, tLocation, tHeight, tWeight from #temp
On DUPLICATE KEY Update Weight = tWeight
我打算建议使用如下所示的 Merge 语句,但看起来 MySQL 不处理这些。
Merge Into people
using #temp
on target.name = #temp.tname
when matched then Update
set target.weight = #temp.tweight
when not matched then
Insert (target.name, target.age, target.location, target.height, target.weight)
values (#temp.tname, #temp.tage, #temp.tlocation, #temp.theight, #temp.tweight);