将非重复数据插入 table
Insert non-repeating data into table
我有一个文件已成功更新为 table。现在,我需要以不重复数据的方式再次执行此操作。
我的目标table:
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 | |
+----------+-------------+------+-----+---------+----------------+
所以我所做的是创建一个临时 table 并将文件中的数据加载到其中。
使用的代码:
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'(就像这里提到的那样)将数据从临时 table 插入 table 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 |
+----------+---------+
对自己没有印象。我做错了什么?
这是因为您的 MARCA 列上没有 UNIQUE 索引。
alter table MARCAS add unique(MARCA);
If you specify ON DUPLICATE KEY UPDATE, and a row is inserted that
would cause a duplicate value in a UNIQUE index or PRIMARY KEY, MySQL
performs an UPDATE of the old row.
来源:http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html
另请注意,加载数据时也可以执行 INSERT IGNORE 或 A REPLACE。
你能从中得到一些想法吗
INSERT INTO MARCAS(field1)
WHERE NOT EXISTS (
SELECT field1 FROM MARCAS WHERE name = 'field1'
) LIMIT 1;
我有一个文件已成功更新为 table。现在,我需要以不重复数据的方式再次执行此操作。
我的目标table:
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 | |
+----------+-------------+------+-----+---------+----------------+
所以我所做的是创建一个临时 table 并将文件中的数据加载到其中。
使用的代码:
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'(就像这里提到的那样)将数据从临时 table 插入 table 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 |
+----------+---------+
对自己没有印象。我做错了什么?
这是因为您的 MARCA 列上没有 UNIQUE 索引。
alter table MARCAS add unique(MARCA);
If you specify ON DUPLICATE KEY UPDATE, and a row is inserted that would cause a duplicate value in a UNIQUE index or PRIMARY KEY, MySQL performs an UPDATE of the old row.
来源:http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html
另请注意,加载数据时也可以执行 INSERT IGNORE 或 A REPLACE。
你能从中得到一些想法吗
INSERT INTO MARCAS(field1)
WHERE NOT EXISTS (
SELECT field1 FROM MARCAS WHERE name = 'field1'
) LIMIT 1;