Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/09/2011, 13h46   #1
Invité régulier
 
Inscription : juin 2007
Messages : 34
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 34
Points : 9
Points : 9
Par défaut Comment éviter les doubles entrées dans une base de données ?

Bonjour,

On essaye d'importer dans une base de données, le contenu d'un fichier .csv , comment faire pour éviter d'importer des entrées similaires ?

sachant que le fichier csv contient un unique numéro qu'on peut utiliser.


Merci
grazianno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 13h58   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Comme je l'ai dit dans cette autre réponse que je t'ai faite hier soir :
Citation:
D'une manière générale d'ailleurs, il vaut mieux importer le fichier CSV dans une table temporaire puis répartir les données comme il se doit dans une BDD structurée et normalisée avec les bons types de colonnes.
Il va vraiment falloir que je l'écrive cet article sur l'importation des données de fichiers csv !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 14h00   #3
Invité régulier
 
Inscription : juin 2007
Messages : 34
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 34
Points : 9
Points : 9


tu as tout à fait raison CinePhil, en attendant l'article , est ce que c'est possible de m'aider ?
grazianno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 14h45   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Si tu expliques mieux ton besoin, oui.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 14h52   #5
Invité régulier
 
Inscription : juin 2007
Messages : 34
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 34
Points : 9
Points : 9
l'ajout du contenu d'un fichier csv à la base de donnée , sans avoir de double , parcequ'on compte utiliser cronjob pour effectuer automatiquement l'opération.


exemple du csv:

Citation:
"header1","header2","header3","tite_du_code_unique","header4","header5"
"text1" ,"text2" ,"text3" ,"code" ,"text4" ,"text5"
"text11" ,"text12" ,"text13" ,"code1" ,"text14" ,"text15"
il nous faut un moyen pour n'ajouter que les nouveaux entrées en se basant sur le code unique.


Merci
grazianno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 14h54   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Tu veux ajouter des données dans une table existante en évitant de ré-insérer les lignes dont le code existe déjà dans la table ?

Doc MySQL :
Citation:
Les mots réservés REPLACE et IGNORE contrôlent la méthode d'insertion de lignes lorsque des doublons apparaissent pour les clés uniques.
Si vous spécifiez REPLACE, les nouvelles lignes remplaceront les anciennes. See Section 13.1.6, « Syntaxe de REPLACE ».
Si vous spécifiez IGNORE, les nouvelles lignes seront ignorées. Si vous ne spécifiez pas cette option, une erreur sera générée à chaque doublon, et le reste du fichier sera ignoré.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 14h55   #7
Invité régulier
 
Inscription : juin 2007
Messages : 34
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 34
Points : 9
Points : 9
oui c'est cela.
grazianno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 15h06   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Comme j'ai édité mon précédent message pendant ta réponse, regarde ce que j'ai ajouté, cela te suffira peut-être.

Sinon, comme je le préconise, importe le fichier csv dans une nouvelle table temporaire puis importe les données utiles dans la vraie table.
Code :
1
2
3
4
5
6
7
8
INSERT INTO la_vraie_table (les_colonnes)
SELECT les_colonnes_correspondantes 
-- éventuellement avec des opérations de conversion vers les bons types de données
FROM la_table_temporaire
WHERE le_code_unique NOT IN(
  SELECT le_code_unique
  FROM la_vraie_table
)
Tu auras peut être besoin d'isoler les codes uniques existant dans une table temporaire car MySQL n'aime pas que la table en cours de modif soit dans une sous-requête.

Ça fait longtemps que je n'ai plus fait ça alors je ne me souviens plus de la méthode exacte mais c'est l'idée. Je peaufinerai ça quand j'écrirai mon article.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 15h10   #9
Membre Expert
 
Inscription : mars 2005
Messages : 1 565
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2005
Messages : 1 565
Points : 2 178
Points : 2 178
Pourquoi ne pas simplement mettre une contrainte d'unicité sur le code en question et déverser les données dans la table ? Les lignes violant la contrainte d'unicité ne seront pas ajoutées.

(Trop) simple mais ça devrait répondre au besoin.
vmolines est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 15h22   #10
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Oui, c'est ce que je suggérais avec l'encadré issu de la doc MySQL.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 15h32   #11
Invité régulier
 
Inscription : juin 2007
Messages : 34
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 34
Points : 9
Points : 9
oui mais comment réaliser la contrainte d'unicité sur le code ?

j'utilise ce fichier pour ajouter le contenu csv à la base de donnée.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
 
<?php
/********************************/
/* Code at http://legend.ws/blog/tips-tricks/csv-php-mysql-import/
/* Edit the entries below to reflect the appropriate values
/********************************/
$databasehost = "";
$databasename = "";
$databasetable = "data";
$databaseusername ="";
$databasepassword = "";
$fieldseparator = ",";
$lineseparator = "\n";
$csvfile = "data.csv";
/********************************/
/* Would you like to add an ampty field at the beginning of these records?
/* This is useful if you have a table with the first field being an auto_increment integer
/* and the csv file does not have such as empty field before the records.
/* Set 1 for yes and 0 for no. ATTENTION: don't set to 1 if you are not sure.
/* This can dump data in the wrong fields if this extra field does not exist in the table
/********************************/
$addauto = 0;
/********************************/
/* Would you like to save the mysql queries in a file? If yes set $save to 1.
/* Permission on the file should be set to 777. Either upload a sample file through ftp and
/* change the permissions, or execute at the prompt: touch output.sql && chmod 777 output.sql
/********************************/
$save = 1;
$outputfile = "data.sql";
/********************************/
IF(!file_exists($csvfile)) {
	echo "File not found. Make sure you specified the correct path.\n";
	exit;
}
$file = fopen($csvfile,"r");
IF(!$file) {
	echo "Error opening data file.\n";
	exit;
}
$size = filesize($csvfile);
IF(!$size) {
	echo "File is empty.\n";
	exit;
}
$csvcontent = fread($file,$size);
fclose($file);
$con = @mysql_connect($databasehost,$databaseusername,$databasepassword) OR die(mysql_error());
@mysql_select_db($databasename) OR die(mysql_error());
$lines = 0;
$queries = "";
$linearray = array();
foreach(split($lineseparator,$csvcontent) AS $line) {
	$lines++;
	$line = trim($line," \t");
	$line = str_replace("\r","",$line);
	/************************************
	This line escapes the special character. remove it if entries are already escaped in the csv file
	************************************/
	$line = str_replace("'","\'",$line);
	/*************************************/
	$linearray = explode($fieldseparator,$line);
	$linemysql = implode(",",$linearray);
	IF( $lines > 1) {
	IF($addauto)
		$query = "insert into $databasetable values('','$linemysql');";
	else
		$query = "insert into $databasetable values($linemysql);";
	$queries .= $query . "\n";
	@mysql_query($query);
}
}
@mysql_close($con);
IF($save) {
	/*if(!is_writable($outputfile)) {
		echo "File is not writable, check permissions.\n";
	}
	else {*/
		$file2 = fopen($outputfile,"w");
		IF(!$file2) {
			echo "Error writing to the output file.\n";
		}
		else {
			fwrite($file2,$queries);
			fclose($file2);
		}
	//}
}
echo "Found a total of $lines records in this csv file.\n";
?>
grazianno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 15h41   #12
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Je croyais que tu utilisais simplement LOAD DATA INFILE pour importer le fichier csv !

La contrainte d'unicité se pose sur la table dans MySQL par l'ajout d'un index de type UNIQUE, à moins que celui n'existe déjà.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 16h14   #13
Invité régulier
 
Inscription : juin 2007
Messages : 34
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 34
Points : 9
Points : 9
j'ai essayé de recréer la table en ajoutant

UNIQUE code

Code :
1
2
3
4
5
6
7
8
9
CREATE TABLE IF NOT EXISTS `data` (
  `header1` text NOT NULL,
  `header2` text NOT NULL,
  `header3` text NOT NULL,
  `tite_du_code_unique` text NOT NULL,
  `header4` text NOT NULL,
  `header5` text NOT NULL
   UNIQUE (tite_du_code_unique)
) ENGINE=MyISAM;
mais ça marche pas
grazianno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 16h35   #14
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par grazianno Voir le message
mais ça marche pas
Et comme j'ai une boule de cristal sur mon bureau, je vois tout de suite quels symptômes font que "ça marche pas" !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 00h38   #15
Invité régulier
 
Inscription : juin 2007
Messages : 34
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 34
Points : 9
Points : 9
aucune idée

je crois que je vais essayer distinct dans select.
grazianno est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h34.


 
 
 
 
Partenaires

Hébergement Web