通过消除重复将数据从文本文件加载到mysql数据库

Posted

技术标签:

【中文标题】通过消除重复将数据从文本文件加载到mysql数据库【英文标题】:Loading data from text file to mysql database by eliminating duplicates 【发布时间】:2011-12-14 05:56:49 【问题描述】:

我想将数据从文本文件加载到数据库,如果数据已经存在,我需要在加载时转义该数据。

我正在使用以下查询将数据从文本文件加载到 mysql 数据库。

"将文件'F:/wbrdata.txt'中的数据加载到表wbrdatatable中 以“,”结尾的字段 可选地用“”括起来 以 '\r\n' 结尾的行 忽略 1 行(频道、时间、脉搏率、驻留 ID、目标 ID);"

它将数据附加到现有的表数据中。我想避免在加载到数据库时表和文件中已经存在(重复)的公共数据。

我怎样才能做到这一点? 谢谢

问候 桑卡尔

【问题讨论】:

你用什么程序来加载文本文件到mysql 在java中我写了程序来执行上面的查询。 我正在使用简单的 JDBC 程序加载执行此查询 String str="Load data infile 'F://Hello.txt' into table newwbrtable fields 以 ',' 结尾,可选地由 \"\ 括起来" 以 '\r\n' 结尾的行忽略 1 行 (time, channel1,channel2);"; Class.forName(driverclass).newInstance(); con = DriverManager.getConnection(jdbcURL, 用户, 密码); st = con.createStatement(); 【参考方案1】:

尝试将文本文件加载到临时表中(与目标表相同),然后从临时表中删除重复项并将其余部分复制到目标表中。


示例(假设 wbrdatatable_temp 是一个包含文本文件中所有数据的临时表):

CREATE TABLE wbrdatatable(
  id INT(11) NOT NULL AUTO_INCREMENT,
  column1 VARCHAR(255) DEFAULT NULL,
  PRIMARY KEY (id)
);

INSERT INTO wbrdatatable VALUES 
  (1, '111'),
  (2, '222'),
  (3, '333'),
  (4, '444'),
  (5, '555');

CREATE TABLE wbrdatatable_temp(
  id INT(11) NOT NULL AUTO_INCREMENT,
  column1 VARCHAR(255) DEFAULT NULL,
  PRIMARY KEY (id)
);

INSERT INTO wbrdatatable_temp VALUES 
  (1, '111'),
  (2, '222'),
  (10, '100'), -- new record that should be added
  (11, '200'); -- new record that should be added

-- Copy only new records!
INSERT INTO wbrdatatable
SELECT t1.* FROM wbrdatatable_temp t1
  LEFT JOIN wbrdatatable t2
    ON t1.id = t2.id AND t1.column1 = t2.column1
WHERE t2.id IS NULL;

-- Test result
SELECT * FROM wbrdatatable;
+----+---------+
| id | column1 |
+----+---------+
|  1 | 111     |
|  2 | 222     |
|  3 | 333     |
|  4 | 444     |
|  5 | 555     |
| 10 | 100     | -- only new record is added
| 11 | 200     | -- only new record is added
+----+---------+

【讨论】:

我认为您没有收到我的问题。在将数据从文本文件加载到数据库时,如果表中存在相同的数据,那么我将跳过该数据,剩下的我必须加载到表中。 我建议您将所有数据加载到另一个表中,然后删除重复项并添加记录。您甚至可以使用一个查询删除/添加,我将在我的答案中添加一个示例。 非常感谢。它对我有用。但是它为相同的数据(临时表)使用了额外的内存,它不会对庞大的数据库文件造成任何问题吗?在此之前,我们不能使用一些带有某些条件的子查询以及我的查询(将文件加载到数据库中)来转义现有数据。请不要我的这类问题。再次感谢您.... 您也可以将这些字段设为唯一。然后使用 IGNORE 选项加载数据,它会自动跳过所有重复项。【参考方案2】:

试试这个逻辑。

   1. Upload  Text File Data
   2. Check record using select statement on your database

    if(recordexist==true)
            save
    else
            not save

问候

【讨论】:

感谢您的回复。你的意思是,在完成将数据从文件加载到数据库后,我必须过滤所有重复项,对吗?我们不能在使用某些子查询加载到数据库时消除重复项吗?如果您知道可以发送该语法,请......

以上是关于通过消除重复将数据从文本文件加载到mysql数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何提高大型文本文件的数据加载性能[重复]

将 utf-8 编码的文本加载到 MySQL 表中

从文本文件加载数据然后将其存储到数据库中的最快方法

从 MySQL 数据库中检索文本 [重复]

将数据从Json文件加载到Postgresql会导致:错误“重复键值违反唯一约束 - 已存在”。

sqoop export 无法将数据从 hive 仓库文件夹加载到 mysql