1. #1
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    juillet 2015
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : juillet 2015
    Messages : 372
    Points : 149
    Points
    149

    Par défaut Requête update dans mysql

    Bonjour,

    Je rencontre un problème pour faire un update, voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE ebay SET shipping = '2' WHERE shipping = 1.86;
    Je pense que ma requête est correcte mais je ne comprends pas pourquoi rien n'est modifié, il y a écrit 0 ligne affectée dans la console mysql.

    Je veux que l'ensemble de la colonne shipping portant comme référence 1.86 soit maintenant à 2. Rien de bien extravagant

    Voici ma table au cas ou..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE `ebay` (
      `id` int(5) NOT NULL,
      `title` varchar(80) NOT NULL,
      `price` float NOT NULL,
      `shipping` float NOT NULL,
      `purchase` float NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    Merci à vous

  2. #2
    Expert éminent
    Homme Profil pro
    Développeur Freelance
    Inscrit en
    janvier 2009
    Messages
    3 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Freelance

    Informations forums :
    Inscription : janvier 2009
    Messages : 3 284
    Points : 6 946
    Points
    6 946

    Par défaut

    Bonjour,
    Shipping est de type FLOAT, pourquoi mettre la nouvelle valeur entre quote ?
    D'ailleurs la requête manque de cohérence, la nouvelle valeur est entre quote, et pas l'ancienne...

    Tatayo.

  3. #3
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    juillet 2015
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : juillet 2015
    Messages : 372
    Points : 149
    Points
    149

    Par défaut

    j'ai déjà essayé avec ou sans quote mais toujours la même chose, aucune modification !

  4. #4
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    3 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 3 103
    Points : 6 806
    Points
    6 806
    Billets dans le blog
    1

    Par défaut

    J'abonde dans le sens de ce qu'a mentionné Tatayo, le type avant et après doit être le même, comme ici votre colonne est de type float, pas de quote
    ce qui donne :

    UPDATE ebay SET shipping = 2 WHERE shipping = 1.86

    Par ailleurs, vous devriez avoir soit un message d'erreur indiquant que le type de la valeur n'est pas compatible avec le type de la colonne, soit un code retour mentionnant qu'aucune ligne n'est éligible pour la valeur 1.86
    De plus, le type float est inadapté pour un prix. Float est fait pour les très grandes valeurs sous forme de puissance de 10, la partie décimale est donc approximative.
    Un prix doit être modélisé en format "décimal" ou "numéric" selon les SGBD

  5. #5
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    juillet 2015
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : juillet 2015
    Messages : 372
    Points : 149
    Points
    149

    Par défaut

    Je suis d'accord que le type float n'est peut-être pas adapté pour un prix, mais cela n'explique pas le fait que j'ai 0 ligne modifiée !

    par exemple, même avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE ebay SET shipping = 2.56 WHERE shipping = 1.86;
    Je n'ai toujours aucune ligne modifiée !

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    8 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 8 636
    Points : 20 249
    Points
    20 249
    Billets dans le blog
    4

    Par défaut

    Bonjour,

    Je n'ai toujours aucune ligne modifiée !
    c'est fort possible étant donné qu'avec le type float je suis prêt à parier que la valeur stockée est proche mais non égale à 1.86
    il faut utiliser ROUND

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE ebay SET shipping = 2.56 WHERE ROUND(shipping,2) = 1.86;
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
    J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
    Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous

  7. #7
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    3 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 3 103
    Points : 6 806
    Points
    6 806
    Billets dans le blog
    1

    Par défaut bis repetita

    Citation Envoyé par bndd24 Voir le message
    Je suis d'accord que le type float n'est peut-être pas adapté pour un prix, mais cela n'explique pas le fait que j'ai 0 ligne modifiée
    Pour rappel :
    Citation Envoyé par escartefigue Voir le message
    . . . le type float est inadapté pour un prix. Float est fait pour les très grandes valeurs sous forme de puissance de 10, la partie décimale est donc approximative. . .
    Dit autrement :
    Citation Envoyé par SergioMaster Voir le message
    c'est fort possible étant donné qu'avec le type float je suis prêt à parier que la valeur stockée est proche mais non égale à 1.86
    il faut utiliser ROUND
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE ebay SET shipping = 2.56 WHERE ROUND(shipping,2) = 1.86;
    Mais attention : filtrer sur un montant qui plus est approximatif, est évidement une opération risquée...

  8. #8
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    juillet 2015
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : juillet 2015
    Messages : 372
    Points : 149
    Points
    149

    Par défaut

    Je comprends merci pour les réponses. Du coup pour un prix j'ai essayé de modifier en decimal 5,3 (jusqu’à 5 chiffres dont 2 chiffres après la virgule) mais au moment du changement il m'affiche uniquement 5,0

  9. #9
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    3 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 3 103
    Points : 6 806
    Points
    6 806
    Billets dans le blog
    1

    Par défaut

    La BDD ne peut pas restituer ce qu'elle ne connait pas, quand vous avez voulu stocker la valeur 1,86 dans une colonne de type float, la BDD a stocké une valeur approchée
    A partir de là le mal est fait et vous ne retrouverez jamais la valeur initiale

    Par contre, si désormais vous stockez 1.86 dans la colonne de type décimal, vous retrouverez bien exactement cette valeur

    D'où l'intérêt de bien choisir le typage des attributs dès la conception

  10. #10
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    juillet 2015
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : juillet 2015
    Messages : 372
    Points : 149
    Points
    149

    Par défaut

    Je viens d'ajouter une colonne toute neuve en decimal 5,2 pourtant la structure m'affiche bien 5,0 !

    donc le problème ne vient peut-être pas de là... des idées ?

  11. #11
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    3 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 3 103
    Points : 6 806
    Points
    6 806
    Billets dans le blog
    1

    Par défaut

    Pouvez vous communiquer le DDL de la table (CREATE TABLE) et l'ordre insert

  12. #12
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    juillet 2015
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : juillet 2015
    Messages : 372
    Points : 149
    Points
    149

    Par défaut

    Citation Envoyé par escartefigue Voir le message
    Pouvez vous communiquer le DDL de la table (CREATE TABLE) et l'ordre insert
    c'est à dire ?

    ceci ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    -- phpMyAdmin SQL Dump
    -- version 4.6.4
    -- https://www.phpmyadmin.net/
    --
    -- Client :  127.0.0.1
    -- Généré le :  Sam 06 Janvier 2018 à 14:36
    -- Version du serveur :  5.7.14
    -- Version de PHP :  7.0.10
     
    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    SET time_zone = "+00:00";
     
     
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8mb4 */;
     
    --
    -- Base de données :  `auto`
    --
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `ebay`
    --
     
    CREATE TABLE `ebay` (
      `id` int(5) NOT NULL,
      `title` varchar(80) NOT NULL,
      `price` decimal(5,0) NOT NULL,
      `shipping` float NOT NULL,
      `purchase` float NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
     
    --
    -- Index pour les tables exportées
    --
     
    --
    -- Index pour la table `ebay`
    --
    ALTER TABLE `ebay`
      ADD PRIMARY KEY (`id`);
     
    --
    -- AUTO_INCREMENT pour les tables exportées
    --
     
    --
    -- AUTO_INCREMENT pour la table `ebay`
    --
    ALTER TABLE `ebay`
      MODIFY `id` int(5) NOT NULL AUTO_INCREMENT;
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
    Je viens même de créer une nouvelle table (pour les tests) toute neuve avec une colonne id et une autre test en decimal 5,2 mais il m'affiche toujours 5,0 !!

  13. #13
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    3 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 3 103
    Points : 6 806
    Points
    6 806
    Billets dans le blog
    1

    Par défaut

    D'après le DDL communiqué, la zone prix est en decimal(5,0) et non pas decimal(5,2)

  14. #14
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    juillet 2015
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : juillet 2015
    Messages : 372
    Points : 149
    Points
    149

    Par défaut

    oui et c'est justement le problème

    Je rentre bien 5,2 comme valeur mais dans l'affichage de la structure il m'affiche 5,0 !

  15. #15
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    7 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 7 496
    Points : 22 710
    Points
    22 710

    Par défaut

    Tu es sûr que tu déclares bien un DECIMAL(5,2) et pas un DECIMAL(5.2) ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  16. #16
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    juillet 2015
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : juillet 2015
    Messages : 372
    Points : 149
    Points
    149

    Par défaut

    très sûr

  17. #17
    Rédacteur
    Avatar de SQLpro
    Homme Profil pro
    Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Inscrit en
    mai 2002
    Messages
    17 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 17 445
    Points : 40 423
    Points
    40 423
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par bndd24 Voir le message
    Je suis d'accord que le type float n'est peut-être pas adapté pour un prix, mais cela n'explique pas le fait que j'ai 0 ligne modifiée !

    par exemple, même avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE ebay SET shipping = 2.56 WHERE shipping = 1.86;
    Je n'ai toujours aucune ligne modifiée !
    si cela l'explique parfaitement. Les nombre réels (REAL) et flottants (FLOAT) sont des nombres approximatifs. En mettant 1.86 peut être qu'en interne il y a 1.8599999999999999999999999999 ou 1.8600000000000000001 donc, vous ne le retrouverez jamais. C'est pourquoi il existe le type décimal qui lui est un type précis. Il est donc parfaitement imbécile d'utiliser un type inapproprié et venir se plaindre après de ses conséquences !

    Formez vous !
    Mon site web comme mes bouquins peuvent vous y aider...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  18. #18
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    juillet 2015
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : juillet 2015
    Messages : 372
    Points : 149
    Points
    149

    Par défaut

    Désolé mais non, cela ne résout pas le problème (merci de lire attentivement le topic). Je viens de créer une base de donnée toute neuve, et au moment de créer une table avec un champ decimal 5,2 la structure indique 5,0 ! (VOIR PHOTO).

    Nom : sql.png
Affichages : 35
Taille : 35,2 Ko

  19. #19
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    8 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 8 636
    Points : 20 249
    Points
    20 249
    Billets dans le blog
    4

    Par défaut

    Bonjour,

    Et si c'était un problème lié au GUI ? personnellement j'ai essayé avec HeidiSQL
    un simple SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE TEST(
      id int(5) NOT NULL,
      price DECIMAL(5,2)
    )
    suivi d'un SHOW CREATE TEST pour vérifier
    CREATE TABLE `test` (
    `id` int(5) NOT NULL,
    `price` decimal(5,2) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    cela fonctionne
    Par curiosité j'ai revérifié avec un autre GUI (Rapid SQL) et je n'obtiens pas le même résultat !
    CREATE TABLE test
    (
    id int(10) NOT NULL, // po
    price decimal(5,2) NULL
    ) ENGINE = InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

    Comme ce SGBD n'est pas ma tasse de thé j'en reste là, ce n'est plus un problème SQL mais MySQL
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
    J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
    Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous

  20. #20
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    juillet 2015
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : juillet 2015
    Messages : 372
    Points : 149
    Points
    149

    Par défaut

    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    Et si c'était un problème lié au GUI ? personnellement j'ai essayé avec HeidiSQL
    un simple SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE TEST(
      id int(5) NOT NULL,
      price DECIMAL(5,2)
    )
    cela fonctionne
    Par curiosité j'ai revérifié avec un autre GUI (Rapid SQL) et je n'obtiens pas le même résultat !

    Comme ce SGBD n'est pas ma tasse de thé j'en reste là, ce n'est plus un problème SQL mais MySQL
    Salut SergioMaster je pense que tu as en effet trouvé la source du problème ! Je viens de taper ton code de création de table dans la console mysql et j'ai bien 5,2 dans la structure, mais une fois que je vais dans modifier pour modifier quelque chose de la table (qui n'a rien a voir avec le champ decimal) alors là il me remet 5,0 alors que je n'ai rien modifié ! tu comprends mon explication ? sinon que faire ? pourquoi j'ai un problème "bizarre" comme celui ci ? note : je suis en local sous wamp.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Requêtes UPDATE dans boucles foreach avec array
    Par vinceom92 dans le forum PHP & MySQL
    Réponses: 67
    Dernier message: 16/03/2014, 22h29
  2. Requête update avec MySQL et JDBC
    Par tunisdroid dans le forum NetBeans
    Réponses: 1
    Dernier message: 19/05/2012, 15h50
  3. Requête update dans une boucle for
    Par boubounagh dans le forum JDBC
    Réponses: 3
    Dernier message: 13/01/2012, 15h18
  4. Stocker une requête update dans une table
    Par bigtruck2010 dans le forum PL/SQL
    Réponses: 4
    Dernier message: 07/07/2011, 13h57
  5. Exécuter une requête UPDATE dans une boucle
    Par vacknov dans le forum PHP & MySQL
    Réponses: 4
    Dernier message: 24/10/2008, 18h46

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