IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Update imbriqué qui ne fonctionne pas


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 67
    Points : 48
    Points
    48
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!

  2. #2
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    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?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 67
    Points : 48
    Points
    48
    Par défaut
    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) .

  4. #4
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    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?

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    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

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 67
    Points : 48
    Points
    48
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    Select ID From Immeuble Where Proprietaire Not In ( Select ID From Proprietaire)

  7. #7
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    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?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 67
    Points : 48
    Points
    48
    Par défaut
    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.

  9. #9
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 039
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 039
    Points : 23 787
    Points
    23 787
    Par défaut
    Bonjour,

    As-tu essayé avec une jointure ? Parce que MySQL accepte les jointures dans l'UPDATE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

Discussions similaires

  1. Update et replace qui ne fonctionnent pas
    Par maysa dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 11/02/2008, 13h47
  2. [MySQL] Code PHP sur des UPDATE qui ne fonctionne pas
    Par bilou95 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 08/10/2007, 11h57
  3. Requete UPDATE qui ne fonctionne pas
    Par JiB@ dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 02/03/2007, 18h06
  4. [MySQL] Requête update qui ne fonctionne pas
    Par Sylvain245 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 05/12/2005, 16h40
  5. [MySQL] UPDATE qui ne fonctionne pas
    Par philippef dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 13/09/2005, 14h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo