【问题标题】:Insert non-repeating data into table将非重复数据插入表中
【发布时间】:2016-09-21 10:21:50
【问题描述】:

我有一个已成功更新到表格的文件。现在,我需要以不重复数据的方式再次执行此操作。

我的目标表:

mysql> show columns from MARCAS;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| ID_MARCA | int(11)     | NO   | PRI | NULL    | auto_increment |
| MARCA    | varchar(50) | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+

所以我所做的是创建一个临时表并将文件中的数据加载到其中。

使用的代码:

CREATE TEMPORARY TABLE tempe LIKE marcas;
LOAD DATA LOCAL INFILE myfile.txt
INTO TABLE MARCAS
FIELDS TERMINATED BY '#' ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(ID_MARCA, MARCA, @ignore1, @ignore2, @ignore3);

这里一切都好。当我试图变得聪明并使用'ON DUPLICATE KEY'(就像这里建议的那样)将临时表中的数据插入到表MARCAS中时,问题就开始了,因为数据不会重复自己。我使用的代码是:

INSERT into MARCAS select * from TEMPE on duplicate key update MARCA=values(MARCA);

结果:

mysql> select * from MARCAS;
+----------+---------+
| ID_MARCA | MARCA   |
+----------+---------+
|        1 | PICASSA |
|        2 | PICASSA |
|        3 | C4      |
|        4 | C4      |
|        5 | C3      |
|        6 | C3      |
|        7 | C2      |
|        8 | C2      |
|        9 | MONDEO  |
|       10 | MONDEO  |
|       11 | S-MAX   |
|       12 | S-MAX   |
|       13 | CIVIC   |
|       14 | CIVIC   |
|       15 | ACCORD  |
|       16 | ACCORD  |
|       17 | CLS     |
|       18 | 900     |
|       19 | LEON    |
|       20 | LEON    |
|       21 | IBIZA   |
|       22 | IBIZA   |
|       23 | 307     |
|       24 | 307     |
|       25 | 308     |
|       26 | 308     |
|       27 | 407     |
|       28 | 407     |
|       29 | 408     |
|       30 | 408     |
|       31 | MEGANE  |
|       32 | MEGANE  |
|       33 | PASSAT  |
|       34 | PASSAT  |
|       35 | GOLF    |
|       36 | GOLF    |
|       37 | TOUAREG |
+----------+---------+

对自己没有印象。我做错了什么?

【问题讨论】:

    标签: mysql sql insert on-duplicate-key


    【解决方案1】:

    这是因为您的 MARCA 列上没有唯一索引。

    alter table MARCAS add unique(MARCA);
    

    如果您指定 ON DUPLICATE KEY UPDATE,并插入一行 会导致 UNIQUE 索引或 PRIMARY KEY 中的重复值,MySQL 对旧行执行 UPDATE。

    来源:http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

    还请注意,在加载数据时也可以执行 INSERT IGNORE 或 A REPLACE。

    【讨论】:

    • 谢谢!像往常一样非常有帮助。 :-) 我还注意到我的数据是从文件的第二列加载的。首先被完全忽略。有什么理由吗?
    • 很高兴能提供帮助。祝你的项目一切顺利
    • 哎呀,看来我错过了您的部分评论。真的很抱歉,但很高兴听到一切都很好
    【解决方案2】:

    希望你能从中得到一些想法

    INSERT INTO MARCAS(field1)
    WHERE NOT EXISTS (
        SELECT field1 FROM MARCAS WHERE name = 'field1'
    ) LIMIT 1;
    

    【讨论】:

    • 那会很慢
    猜你喜欢
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 2020-04-17
    • 1970-01-01
    相关资源
    最近更新 更多