Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes 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 05/01/2012, 11h16   #1
Invité de passage
 
Homme
Développeur Web
Inscription : juin 2011
Messages : 11
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : juin 2011
Messages : 11
Points : 0
Points : 0
Par défaut Ignorer les insertions violant les contraintes d'intégrité

Hello tout le monde.

Je travaille actuellement sur un transfert de base de donnée et on en profite pour modifier quelques tables et réécrire un déploiement. Le déploiement a été généré sans problème mais contient un peu plus de 30000 insertions, dont moins d'une cinquantaine (seulement) présentant des problèmes d'intégrités : la clé étrangère B ne correspond pas à une clé primaire A inexistante dans la table associée. Cela n'est pas une erreur de conception mais bien les données qui ont été "mal insérées" dès le départ et la table n'envoie elle-même aucune clé ailleurs.

J'aimerais donc faire en sorte que ces lignes là soient tout bonnement ignorées, que les insertions foireuses ne soient pas effectuées et n'avoir au moins que des simples warnings, car je me vois pas épelucher les 30000 insertions pour chercher laquelle foire, surtout que MySQL m'indique pas laquelle est foireuse...

INSERT IGNORE ne permet pas d'ignorer la ligne foireuse. J'ai pensé utiliser un trigger mais je vois pas comment empêcher l'insertion à partir de ce trigger. Levée d'une exception peut-être ?

Auriez-vous une solution à ce problème à suggérer ?

Merci pour vos éclairages.
pierred69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 11h24   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
bonjour,

Pourquoi ne changez vous pas vos requête d'insertion pour que ce cas ne se produise pas ? Vous avez trop de requêtes ?

Sinon : http://dev.mysql.com/doc/refman/5.5/en/insert.html

Citation:
If you use the IGNORE keyword, errors that occur while executing the INSERT statement are treated as warnings instead. For example, without IGNORE, a row that duplicates an existing UNIQUE index or PRIMARY KEY value in the table causes a duplicate-key error and the statement is aborted. With IGNORE, the row still is not inserted, but no error is issued.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 11h28   #3
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 331
Points : 18 331
Envoyer un message via MSN à CinePhil
La solution rigoureuse consiste à faire une requête qui cherche quelles lignes vont poser problème.
Une requête du genre :
Code :
1
2
3
4
5
6
7
SELECT t1.id, t1.fk
FROM table_1 t1
WHERE NOT EXISTS (
	SELECT *
	FROM table_2 t2
	WHERE t2.id = t1.fk
)
Ça te permettra d'analyser (ou de faire analyser par des gens du métier) les données fautives et prendre une décision raisonnée quant à leur traitement (non importation, affectation de la bonne clé étrangère...) et donc ensuite de les éliminer de l'import ou des les importer après correction.
__________________
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 05/01/2012, 11h36   #4
Invité de passage
 
Homme
Développeur Web
Inscription : juin 2011
Messages : 11
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : juin 2011
Messages : 11
Points : 0
Points : 0
Citation:
Envoyé par punkoff Voir le message
bonjour,

Pourquoi ne changez vous pas vos requête d'insertion pour que ce cas ne se produise pas ? Vous avez trop de requêtes ?

Sinon : http://dev.mysql.com/doc/refman/5.5/en/insert.html
IGNORE comme j'ai dit n'a pas l'air de fonctionner pour les contraintes d'intégrité...

Sinon je prends note de ta réponse CinePhil merci à toi
pierred69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 23h04   #5
Membre du Club
 
Inscription : février 2008
Messages : 73
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 73
Points : 57
Points : 57
INSERT IGNORE fonctionne si tu fais une insertion à la fois et pas un gros batch des familles qui te fait tout d'un coups. J'ai eu le même genre de souci et c'est comme cela que j'ai corrigé le tir.
iliak est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h15.


 
 
 
 
Partenaires

Hébergement Web