2016-09-21 5 views
1

Ich habe eine Datei, die ich erfolgreich zu einer Tabelle aktualisiert habe. Nun muss ich es erneut so machen, dass die Daten nicht wiederholt werden.Einfügen nicht wiederholter Daten in Tabelle

meine Zieltabelle:

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 |    | 
+----------+-------------+------+-----+---------+----------------+ 

Also, was ich tat, war eine temporäre Tabelle und geladene Daten aus der Datei in es zu erstellen.

Kode:

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); 

Alle hier in Ordnung. Das Problem beginnt, wenn ich versuche, schlau zu sein und 'ON DUPLICATE KEY' (wie hier) zu verwenden, um Daten aus der temporären Tabelle in die Tabelle MARCAS einzufügen, da sich die Daten nicht selbst wiederholen. Der Code, den ich verwendet wurde:

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

Das Ergebnis:

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 | 
+----------+---------+ 

Nicht beeindruckt mich. Was mache ich falsch?

Antwort

1

Es wird durch die Tatsache verursacht, dass Sie keinen eindeutigen Index auf Ihrer MARCA Spalte haben.

alter table MARCAS add unique(MARCA); 

Wenn Sie ON DUPLICATE KEY UPDATE angeben, und eine Zeile eingefügt, dass in ein einen doppelten Wert verursachen würde UNIQUE Index oder PRIMARY KEY, MySQL eine Aktualisierung der alten Zeile führt .

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

Bitte beachten Sie auch, dass es auch möglich ist, INSERT ignorieren oder A ersetzen, wenn Sie eine Ladedaten zu tun.

+0

Dank erhalten! wie immer sehr hilfreich. :-) was mir auch aufgefallen ist, dass meine Daten aus der zweiten Spalte in Datei geladen werden. Zuerst wird es komplett ignoriert. Irgendein Grund dafür? – CNB

+0

und es war mir eine Freude, Ihnen behilflich zu sein. alles Gute mit deinem Projekt – e4c5

+1

Nevermind, gefunden, wo ich falsch lag. :-) – CNB

0

Möchtest du eine Vorstellung von diesem

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

das wird wirklich langsam – e4c5

Verwandte Themen