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 :

replace_into semble fonctionner différemment


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    électronicien
    Inscrit en
    Octobre 2006
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : électronicien
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2006
    Messages : 225
    Par défaut replace_into semble fonctionner différemment
    Bonjour.
    J'ai créé une table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE IF NOT EXISTS `variables` (
          		`id` INT UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT PRIMARY KEY ,
     		`nom` VARCHAR( 20 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL ,
     		`value` LONGTEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL 
    		) ENGINE=MyISAM  CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    J'ai une requete qui ne passe plus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    REPLACE INTO `variables` (`id`,`nom`,`value`)VALUES ('',"test","ici")
    #1366 - Incorrect integer value: '' for column 'id' at row 1
    Avant il me créait une nouvel enregistrement ?

    10.2.18-MariaDB

    La fonction aurait elle évolué ?

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 : 16 818
    Billets dans le blog
    14
    Par défaut
    1) Pourquoi faire un REPLACE plutôt qu'un INSERT ?

    2) La colonne id est de type entier et vous lui donnez en valeur une chaîne vide ! Pourquoi ?
    Le message d'erreur que vous obtenez est d'ailleurs explicite à ce sujet !

    3) De plus, elle est auto-incrémentée donc vous n'avez pas besoin de spécifier l'identifiant dans votre requête d'insertion.

    4) En SQL, les valeurs textuelles s'écrivent entre apostrophes, pas entre guillemets !

    5) Vous devriez nommer vos tables au singulier. Le pluriel peut prêter à confusion dans la compréhension du schéma.

    6) Le moteur MyISAM ne bénéficie pas des clés étrangères. Vous risquez donc une incohérence de données si vous n'utilisez pas cet outil essentiel de l'intégrité référentielle entre les tables.

    7) Pour la colonne value est-elle de type LONGTEXT ? Vous voulez enregistrer des romans en base de données ?


    Ceci fonctionnerait mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO variables (nom, value)
    VALUES ('test', 'ici')
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  3. #3
    Membre éclairé
    Homme Profil pro
    électronicien
    Inscrit en
    Octobre 2006
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : électronicien
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2006
    Messages : 225
    Par défaut
    Merci de ces précieux conseils. Je ne suis pas expert du tout: Ça se voit. Mais je note régulièrement tout ce qui m'est dit.
    La commande REPLACE fait un INSERT ou un UPDATE en fonction de ce qu'elle reçoit.
    En passant un ID vide, elle faisait un INSERT auparavant, mais ça ne fonctionne plus maintenant.
    Merci pour cette aide qui me permettra de faire quelque chose de plus propre.

  4. #4
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 913
    Par défaut
    Salut à tous.

    Citation Envoyé par CinePhil
    1) Pourquoi faire un REPLACE plutôt qu'un INSERT ?
    C'est une commande qui permet dee faire à la fois un INSERT si la ligne n'existe pas ou un UPDATE si la ligne existe déjà.

    Citation Envoyé par CinePhil
    2) La colonne id est de type entier et vous lui donnez en valeur une chaîne vide ! Pourquoi ?
    Le message d'erreur que vous obtenez est d'ailleurs explicite à ce sujet !
    @ LampeRouge : En effet, pourquoi mettre vide comme valeur pour la colonne "id" ?
    Cette colonne attend une valeur numérique entière et rien d'autre.

    Il faut être logique, soit vous mettez une valeur numérique entière pour la colonne "id" et dans ce cas là, je comprends pourquoi vous utilisez le REPLACE.
    Soit vous n'introduisez pas la colonne "id" dans votre requête et vous laissez MySql se débrouiller tout seul pour lui attribuer une valeur.
    Mais dans ce cas là, ce n'est pas un REPLACE que vous devez faire, mais bien un INSERT.

    Ne pas oublier que le critère du choix de l'insertion ou de la mise à jour se fait sur votre clef primaire, qui dans ce cas-çi est la colonne "id".

    Citation Envoyé par CinePhil
    3) De plus, elle est auto-incrémentée donc vous n'avez pas besoin de spécifier l'identifiant dans votre requête d'insertion.
    Ca depend de l'usage que LampeRouge veut faire de sa requête.
    S'il précise une valeur à la colonne "id", deux cas peuvent se présenter.
    a) soit la valeur de la colonne "id" existe déjà dans la table et sa requête va faire une mise à jour.
    b) soit la valeur de la colonne "id" n'existe pas dans la table et sa requête va faire une insertion.

    S'il désire conserver le "REPLACE" alors il doit préciser la colonne "id" afin que la requête sache quoi faire sur la ligne, comme je viens de l'expliquer.
    S'il ne désire pas mettre la colonne "id" dans sa requête, le mieux est de mettre un INSERT à la place.

    Citation Envoyé par CinePhil
    4) En SQL, les valeurs textuelles s'écrivent entre apostrophes, pas entre guillemets !
    En SQL pur, je veux bien. Mais ne sachant pas le contexte où se trouve cette requête, on peut supposer qu'il s'agisse en fait du php.
    --> https://pbnaigeon.developpez.com/tut...phe-guillemet/
    de ce fait, une chaîne entre apostrophe ne sera pas modifier tandis qu'une chaîne entre guillemet peut éventuellement l'être.

    Citation Envoyé par CinePhil
    5) Vous devriez nommer vos tables au singulier. Le pluriel peut prêter à confusion dans la compréhension du schéma.
    Entièrement d'accord. On peut même ajouter un préfixe s'il est nécessaire de faire une distinction sur le suffixe.

    Citation Envoyé par CinePhil
    6) Le moteur MyISAM ne bénéficie pas des clés étrangères. Vous risquez donc une incohérence de données si vous n'utilisez pas cet outil essentiel de l'intégrité référentielle entre les tables.
    7) Pour la colonne value est-elle de type LONGTEXT ? Vous voulez enregistrer des romans en base de données ?[/quote]
    --> https://dev.mysql.com/doc/refman/8.0...-overview.html

    La bonne question concerne l'usage que l'on va faire de se texte.
    Et si l'on pratique une recherche sur des mots clefs, il vaut mieux définir cette colonne en "FTS" (full text serach).

    En ce qui concerne la syntaxe du REPLACE, je vous conseille de lire la documentation mysql :
    --> https://dev.mysql.com/doc/refman/8.0/en/replace.html

    Si vous désirez faire une insertion dans la table, vous avez le choix entre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO variables (`nom`, `value`) VALUES ('test', 'ici');
    ou bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    REPLACE INTO variables (`nom`, `value`) VALUES ('test', 'ici');
    qui aura la même syntaxe que le INSERT.

    Juste une remarque : quand vous utilisez des mots réservés, vous devez les mettre entre apostrophes inversées.
    Il s'agit de la touche : alt gr + 7 : `

    @+

Discussions similaires

  1. Sources Identique, fonctionne différemment
    Par G_angel dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 07/10/2010, 22h17
  2. setFont ne semble pas fonctionner
    Par Nico57 dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 25/07/2007, 14h37
  3. [PDO] et bindValue qui ne semble pas fonctionner
    Par Tommyl dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 31/10/2006, 16h12
  4. Ma table temporaire ne semble pas fonctionner.
    Par outshined dans le forum Requêtes
    Réponses: 2
    Dernier message: 12/09/2006, 14h40
  5. [firePropertyChange] semble ne pas fonctionner ?
    Par jcodeunpeu dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 19/12/2005, 14h37

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