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 30/06/2011, 22h24   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 53
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 53
Points : 13
Points : 13
Par défaut Update imbriqué qui ne fonctionne pas

Bonsoir,

J'ai 2 tables (immeuble, proprietaire);
Immeuble (
ID,
Proprietaire)

Proprietaire(
ID,
NomProprietaire)


Immeuble(Proprietaire) est lié à Proprietaire(ID) normalement.

J'ai fait un premier enregistrement qui enregistrait dans chaque immeuble, l'identifiant du propriétaire s'il existait.
Ensuite, j'ai voulu remplir les champs vides restants, par un autre algorithme (je ne vais pas détailler). Le souci, c'est que ces champs qui sont maintenant remplis, sont remplis d'erreurs. Ces erreurs, ne correspondent en rien aux ID des propriétaires.

J'ai donc pensé à faire cette requête :
Code :
1
2
3
4
UPDATE Immeuble
SET Proprietaire = ''
WHERE Proprietaire NOT IN (
 SELECT ID FROM Proprietaire);
La requête Select ID From Proprietaire me renvoie tous les identifiants des propriétaires.

Cependant, quand je lance la requête d'update, elle ne fonctionne pas, pas d'erreur de syntaxe ni rien, juste "0 enregistrement affecté".

Pouvez-vous me l'expliquer s'il vous plait?

Je vous remercie!
Unreal Time est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 22h34   #2
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 853
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

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

Informations forums :
Inscription : avril 2011
Messages : 853
Points : 1 332
Points : 1 332
salut,

c'est quoi une erreur pour toi?

c'est quoi les moteurs: myisam, innodb?

tu essayes de mettre du texte ( '' ) dans un champ numérique... ça te choque pas un peu?
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 23h06   #3
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 53
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 53
Points : 13
Points : 13
Citation:
Envoyé par ericd69 Voir le message
salut,

c'est quoi une erreur pour toi?

c'est quoi les moteurs: myisam, innodb?

tu essayes de mettre du texte ( '' ) dans un champ numérique... ça te choque pas un peu?

Une erreur, pour moi c'est quand il y a un problème entre ce qu'on attend et ce qui se produit.
MyIsam : type de table utilisé en MySql qui permet une recherche efficace sur du texte
InooDb : type de table utilisé essentiellement pour faire des relations
(pour ce que j'en sais).

Les champs ID propriétaires sont des champs varchar (oubliés de le dire) .
Unreal Time est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 23h22   #4
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 853
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

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

Informations forums :
Inscription : avril 2011
Messages : 853
Points : 1 332
Points : 1 332
lol oui mais nous, on ne sait pas ce que ça te fait à quoi elles ressemblent tes erreurs...

c'est très bien, tu as compris ce que ces moteurs sont mais je te demandais en fait quel type de moteur tu utilises pour tes tables...

je vais donc te le dire à toi aussi, les clés primaires et étrangères ne doivent jamais être des champs textes... car il y a des indexes automatiques sur elles et que c'est pas du tout performant et hyper lourd en termes de place que représente ta table en mémoire et en terme de fichiers aussi...

ID= identifiant... ça veut dire qu'on utilise un code numérique qui permet de faire des recherches sur des indexes très légers et efficaces....

avant qu'on refasse un peu mieux, déjà, tes tables, explique ce que tu veux faire et la totalité des données que tu veux brasser...

comme ça, on fera un schéma de base de données efficace et qui collera à ce que tu veux faire...

qu'en penses-tu?
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 00h33   #5
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Est ce qu'ID dans la table proprietaire est défini comme Primary Key ? Sinon ça devrait être le cas.

Un NULL dans la colonne ID de la table proprietaire fera "planter" la requête :
select-not-in
help-not-in-sql
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 06h41   #6
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 53
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 53
Points : 13
Points : 13
J'ai simplifié au maximum mes tables réelles, mais l'enjeu y est.
Il n'y a pas d'erreurs comme tu l'entends, c'est juste qu'il affiche un "0 enregistrements affectés".

Je comprends tout à fait l'intérêt de mettre un champ numérique, mais dans mon cas, je dois laisser ce champ texte.

Je te remercie pour tes propositions d'optimisation.


Oui, l'ID du proprietaire est une primary key.
Il n'y a pas de NULL dans la table proprietaire, seulement dans le champ proprietaire de la table Immeuble.

Je précise : la requête en select fonctionne parfaitement avec
Code :
SELECT ID FROM Immeuble WHERE Proprietaire NOT IN ( SELECT ID FROM Proprietaire)
Unreal Time est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 15h00   #7
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 853
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

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

Informations forums :
Inscription : avril 2011
Messages : 853
Points : 1 332
Points : 1 332
si tu as pu rentrer des valeurs pas dans la table liée c'est que tu es en myisam et qu'il n' y a donc pas de respect de l'intégrité référentielle...

ta requête de test sort combien de résultats?
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2011, 09h54   #8
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 53
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 53
Points : 13
Points : 13
Citation:
Envoyé par ericd69 Voir le message
si tu as pu rentrer des valeurs pas dans la table liée c'est que tu es en myisam et qu'il n' y a donc pas de respect de l'intégrité référentielle...

ta requête de test sort combien de résultats?
Oui en effet, c'est bien pour ça que je suis embêté par mon erreur d'avoir fait un update incorrecte sur ce champ.

Ma requête (update) me sort 0 enregistrements affectés, quant à la requête en Select, elle me sort le nombre de résultats qui est attendu.
Unreal Time est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2011, 13h44   #9
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
Bonjour,

As-tu essayé avec une jointure ? Parce que MySQL accepte les jointures dans l'UPDATE :
Code :
1
2
3
4
UPDATE Immeuble
LEFT JOIN Proprietaire ON Immeuble.Proprietaire = Proprietaire.id
SET Proprietaire = ''
WHERE Proprietaire.id IS NULL;
Attention, j'écris de tête et je n'ai absolument pas testé cette requête, donc je t'encourage à prendre toutes les précautions avant de l'exécuter
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced 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 03h53.


 
 
 
 
Partenaires

Hébergement Web