我使用LOAD DATA INFILE命令遇到了一些麻烦,因为我想忽略已经在数据库中的行...如果我有一个包含数据的表,如下所示,
id |name |age
--------------------
1 |aaaa |22
2 |bbbb |21
3 |bbaa |20
4 |abbb |22
5 |aacc |22
其中id是自动递增值。我拥有的csv文件包含如下数据,
"cccc","14"
"ssee","33"
"dddd","22"
"aaaa","22"
"abbb","22"
"dhgg","34"
"aacc","22"
我想忽略行
"aaaa","22"
"abbb","22"
"aacc","22"
并将其余内容上传到表格中。我已经将所有内容上传到表中的查询如下,
LOAD DATA INFILE 'member.csv'
INTO TABLE tbl_member
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\n'
(name, age);
请帮助我完成这项任务..我将非常感谢..我试过很多链接但没有帮助:(
答案 0 :(得分:39)
在年龄列上创建一个UNIQUE索引,然后:
LOAD DATA INFILE 'member.csv'
IGNORE INTO TABLE tbl_member
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\n'
(name, age);
答案 1 :(得分:5)
一种方法是使用临时表。上传到此并使用SQL从临时表更新tbl_member。
INSERT INTO tbl_member
SELECT Field1,Field2,Field3,...
FROM temp_table
WHERE NOT EXISTS(SELECT *
FROM tbl_member
WHERE (temp_table.Field1=tbl_member.Field1 and
temp_table.Field2=tbl_member.Field2...etc.)
)
答案 2 :(得分:0)
您可以在多个列上创建唯一索引。 LOAD DATA不会插入与所有列上的现有行匹配的行。
e.g。 ALTER TABLE tbl_member ADD UNIQUE unique_index(name,age)