Lorsque vous utilisez LOAD DATA INFILE, existe-t-il un moyen de signaler une ligne en double ou de transférer tous les doubles dans une table séparée ?
Réponses
Trop de publicités?De la LOAD DATE INFILE documentation :
El REMPLACER et IGNORE contrôlent le traitement des lignes d'entrée qui dupliquent des lignes existantes sur des valeurs de clé uniques :
- Si vous spécifiez REPLACE, les lignes d'entrée remplacent les lignes existantes. En d'autres termes, les lignes qui ont la même valeur pour une clé primaire ou un index unique qu'une ligne existante. Voir la section 12.2.7, "Syntaxe REPLACE". .
- Si vous spécifiez IGNORE, les lignes de saisie qui dupliquent une ligne existante sur une valeur de clé unique sont ignorées. Si vous ne spécifiez aucune de ces options, le comportement dépend de la spécification du mot-clé LOCAL. Sans LOCAL, une erreur se produit lorsqu'une valeur clé dupliquée est trouvée, et le reste du fichier texte est ignoré. Avec LOCAL, le comportement par défaut est le même que si IGNORE est spécifié ; ceci parce que le serveur n'a aucun moyen d'arrêter la transmission du fichier au milieu de l'opération .
En fait, il n'y a aucun moyen de rediriger les enregistrements en double vers une autre table. Il faudrait les charger tous, puis créer une autre table pour contenir les enregistrements non dupliqués.
Il semble qu'il y ait effectivement est quelque chose que vous pouvez faire lorsqu'il s'agit de lignes dupliquées pour les appels LOAD DATA. Cependant, l'approche que j'ai trouvée n'est pas parfaite : elle agit plus comme un journal pour toutes les suppressions sur une table, plutôt que seulement pour les appels LOAD DATA. Voici mon approche :
Tableau test :
CREATE TABLE test (
id INTEGER PRIMARY KEY,
text VARCHAR(255) DEFAULT NULL
);
Tableau test_log :
CREATE TABLE test_log (
id INTEGER, -- not primary key, we want to accept duplicate rows
text VARCHAR(255) DEFAULT NULL,
time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Déclencheur del_chk :
delimiter //
drop trigger if exists del_chk;
CREATE TRIGGER del_chk AFTER DELETE ON test
FOR EACH ROW
BEGIN
INSERT INTO test_log(id,text) values(OLD.id,OLD.text);
END;//
delimiter ;
Importation de test ( /home/user/test.csv
) :
1,asdf
2,jkl
3,qwer
1,tyui
1,zxcv
2,bnm
Une requête :
LOAD DATA INFILE '/home/ken/test.csv'
REPLACE INTO TABLE test
FIELDS
TERMINATED BY ','
LINES
TERMINATED BY '\n' (id,text);
En exécutant la requête ci-dessus, on obtient 1,asdf
, 1,tyui
y 2,jkl
qui sont ajoutés à la table des journaux. Sur la base d'un horodatage, il serait possible d'associer les lignes à un événement particulier. LOAD DATA
déclaration.