1 votes

mysql fait double emploi avec LOAD DATA INFILE

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 ?

11voto

OMG Ponies Points 144785

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.

1voto

cmptrgeekken Points 3863

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X