我创建了一张桌子' One'在mySQL上我从file111(csv)导入数据。它导入日期和名称。
我创建了一张桌子' Two'我从file222(csv)导入数据。它会导入旧名称和新名称。
请记住:
One.names = Two.old_names
我想要一张决赛桌会显示表格中的数据' One'但它会将旧名称替换为新名称。
以下是关于表格创建的代码:
-- Table creation : 'One'
create table One(
report_start date,
name varchar(500)
);
-- Import of Data in the table 'One'
LOAD DATA LOCAL INFILE 'C:/file111.csv'
INTO TABLE One
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
;
-- Table creation with one column for the "old names" and one for the "new names" for "name" field.
create table Two(
old_name varchar(500),
new_name varchar(500)
);
-- Import the OLD names and NEW names in the table 'Two'
LOAD DATA LOCAL INFILE 'C:/file222.csv'
INTO TABLE Two
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
;
现在我有两个选择。一个是 INSERT INTO 创建后的第三个表。正如下图所示:
create table Three(
report_start date,
name varchar(500)
);
-- Our new table has all the data from 'One' except for the "name". The data will be imported in this column fields from the table "Two"
INSERT INTO Three (report_start, name)
SELECT report_start, Two.new_name
FROM One
INNER JOIN Two ON Two.old_name = One.name
;
另一个选项是更新第一个表并使用JOIN:
update One
join Two t on ( One.name = t.old_name )
set One.name=t.new_name;
它们的工作方式相同,但效率更高?我已经开始处理大量数据,因此我需要获得最有效和最安全的数据。
答案 0 :(得分:2)
与大多数优化相关的问题一样,答案是:嗯,这取决于......
如果包含新名称的表明显小于第一个表,则更新很可能更有效。特别是如果你在names和old_names列上创建索引。
如果我是你,我会计算两种解决方案(每次多次)并使用最适合你的方法。
答案 1 :(得分:1)
你应该写第3张表,其表现方式相同或更好,风险方面更好。如果您想对其进行分析,您可以:
SET profiling=1;
run query
SET profiling=0;
SHOW profiles;
如果数据集很大,我还建议您索引连接表。