web-dev-qa-db-fra.com

MYSQL LOAD DATA INFILE ignorer les lignes en double (auto-incrémentation en tant que clé primaire)

J'ai rencontré des problèmes avec la commande LOAD DATA INFILE car je voulais ignorer les lignes qui se trouvaient déjà dans la base de données .. si j'ai une table avec les données suivantes,

id  |name   |age
--------------------
1   |aaaa   |22
2   |bbbb   |21
3   |bbaa   |20
4   |abbb   |22
5   |aacc   |22

Où id est la valeur d'incrémentation automatique. un fichier csv contient des données comme suit,

"cccc","14"
"ssee","33"
"dddd","22"
"aaaa","22"
"abbb","22"
"dhgg","34"
"aacc","22"

Je veux ignorer les lignes,

    "aaaa","22"
    "abbb","22"
    "aacc","22"

et télécharger le reste à la table. et la requête que j'ai encore qui charge tout sur la table est la suivante,

    LOAD DATA INFILE 'member.csv'
    INTO TABLE tbl_member
    FIELDS TERMINATED BY ','
           ENCLOSED BY '"'
           ESCAPED BY '"'
           LINES TERMINATED BY '\n'
    (name, age);

S'IL VOUS PLAÎT aidez-moi sur cette tâche .. Il sera très apprécié .. j'ai essayé de nombreux liens, mais n'a pas aidé :(

16
Hasitha Shan

Créez un index UNIQUE sur la colonne age, puis:

LOAD DATA INFILE 'member.csv'
IGNORE INTO TABLE tbl_member
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\n'
(name, age);
34
Omar

Une approche consiste à utiliser une table temporaire. Téléchargez-le et utilisez SQL pour mettre à jour tbl_member à partir d'une table temporaire.

INSERT INTO tbl_member
SELECT Field1,Field2,Field3,... 
FROM temp_table
WHERE NOT EXISTS(SELECT * 
             FROM tbl_member 
             WHERE (temp_table.Field1=tbl_member.Field1 and
                   temp_table.Field2=tbl_member.Field2...etc.)
            )
5
david strachan

Vous pouvez créer un index unique sur plusieurs colonnes. LOAD DATA n'insère pas de lignes qui correspondent aux lignes existantes sur toutes ces colonnes.

par exemple . ALTER TABLE tbl_member ADD UNIQUE unique_index (nom, âge)

0
RobinKay