【问题标题】:MySQL LOAD DATA LOCAL INFILE avoiding duplicatesMySQL LOAD DATA LOCAL INFILE 避免重复
【发布时间】:2019-06-23 04:37:40
【问题描述】:

我正在使用这个 LOAD DATA LOCAL INFILE 语句来快速上传文件。

LOAD DATA LOCAL INFILE 'file_location/file.txt'
    INTO TABLE mytable 
    FIELDS TERMINATED by '\t'
    LINES TERMINATED BY '\n'
    IGNORE 18 LINES //ignore some header info
    (sampleID, testID);

但是我过去已经加载了一些文件,我想避免重复。

数据库结构包括一个自动递增的 PK 作为附加列。

在上传之前不必打开每个文件并进行搜索以确定这些记录是否已经存在,有没有办法修改我正在使用的命令来忽略基于同时具有 sampleID 和 testID 行的重复行在与传入文件匹配的表中?

例如,假设当前表有以下行:

tablePKID    sampleID    testID
    0         0001        A
    1         0001        B
    2         0003        A
    3         0003        B

我希望导入一个包含以下记录的文件

  0001        A
  0001        B
  0001        C
  0005        A
  0005        B

我怎样才能确保只有

  0001        C
  0005        A
  0005        B

是进口的吗?

【问题讨论】:

  • 桌子上有钥匙吗?
  • '如果指定 IGNORE,则丢弃与唯一键值上现有行重复的行'dev.mysql.com/doc/refman/8.0/en/load-data.html
  • column "tablePKID" 是一个自动增量 PK - 我想指定构成重复事件的内容,即在我的例子中,列 sampleID 和 testID 的行都与传入行匹配

标签: mysql load-data-infile


【解决方案1】:

我不知道你是如何让 tablePKID 从 0 自动递增的,现在你可以在 samplid 和 testid 上指定一个唯一键并加载..IGNORE 例如

DROP TABLE IF EXISTS T;
CREATE TABLE T
(tablePKID   INT auto_increment primary key, 
sampleID VARCHAR(10),   testID VARCHAR(10));

alter table t
    add unique key k1(sampleid,testid);

INSERT INTO T (sampleid,testid) VALUES
(   '0001'   ,     'A'),
(   '0001'   ,     'B'),
(   '0003'   ,     'A'),
(   '0003'   ,     'B');

文件数据.txt

sampleid    testid
"0001"  "A"
"0001"  "B"
"0001"  "C"
"0005"  "A"
"0005"  "B"


LOAD DATA LOCAL INFILE 'C:\\Program Files\\MariaDB 10.1\\data\\sandbox\\data.txt'
     ignore
    INTO TABLE t 
    FIELDS TERMINATED by '\t'
    enclosed by '"'
    LINES TERMINATED BY '\r\n'
    IGNORE 1 LINES 
    (sampleID, testID);

+-----------+----------+--------+
| tablePKID | sampleID | testID |
+-----------+----------+--------+
|         1 | 0001     | A      |
|         2 | 0001     | B      |
|         3 | 0003     | A      |
|         4 | 0003     | B      |
|         5 | 0001     | C      |
|         6 | 0005     | A      |
|         7 | 0005     | B      |
+-----------+----------+--------+
7 rows in set (0.00 sec)

【讨论】:

  • tablePKID 从 0 自动递增是手动输入。感谢您指出并感谢您的解决方案
  • 我应该指出,为了将唯一键添加到填充的表中,必须先删除现有的重复项,否则会遇到 1062 错误
猜你喜欢
  • 2012-10-05
  • 1970-01-01
  • 2012-06-01
  • 2020-07-25
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 2013-09-24
相关资源
最近更新 更多