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

Langage SQL Discussion :

Problème avec un champ d'Index


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Amateur / Programme pour le plaisir
    Inscrit en
    Juillet 2024
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Amateur / Programme pour le plaisir

    Informations forums :
    Inscription : Juillet 2024
    Messages : 15
    Par défaut Problème avec un champ d'Index
    Bonjour,
    C'est mon premier post dans ce forum. Je programme un petit site juste pour un besoin personnel. Il s'agit d'une gestion de base de données avec mes biens acquis et ceux que je désire visible depuis Internet afin d'éviter les doubles achats.
    Voilà, j'ai un petit problème en SQL (enfin je pense) : j'ai une table dans ma base de données qui contient plusieurs champs dont le champ "IDSouhaits" qui est un Index qui (dans PHPMyAdmin) choisi le premier nombre de libre et l'assigne à la nouvelle fiche.
    Bêtement, j'ai pensé que la requête ci-dessous ferait la même chose mais n'en est rien. Y' a t'il un moyen d'y parvenir, ou dois-je m'en remettre à la fonction SQL COUNT ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO `Souhaits` (`IDSouhaits`, `TitreMedia`, `InfoComplementaires`, `TypeMedia`, `VendeursTrouves`, `PrixOfficiel`, `AchatEnCours`, `AchatUrgent`, `ASupprimer`) VALUES ('', 'Test bidonné', '', 'JV', 'AUCUN', '0', '0', '0', '0')
    J'ai testé la création d'une nouvelle fiche dans ma table avec PHPMyAdmin, mais la requête SQL affichée est la même.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Citation Envoyé par MarcBl Voir le message
    le champ "IDSouhaits" (...) est un Index qui (dans PHPMyAdmin) choisit le premier nombre de libre et l'assigne à la nouvelle fiche.
    Tu parles d'un identifiant auto-incrémenté ?

    Le plus simple est de ne pas lui attribuer de valeur à l'insertion de la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO `Souhaits` 
        (`TitreMedia`, `InfoComplementaires`, `TypeMedia`, `VendeursTrouves`, `PrixOfficiel`, `AchatEnCours`, `AchatUrgent`, `ASupprimer`)
    VALUES
        ('Test bidonné', '', 'JV', 'AUCUN', '0', '0', '0', '0')
    Par ailleurs, il est toujours préférable de respecter le type des colonnes lors des insertions et mises à jour. Si les colonnes `PrixOfficiel`, `AchatEnCours`, `AchatUrgent` et `ASupprimer` sont de type numérique, c'est la valeur 0 qu'il faut leur affecter et non la chaîne '0'.
    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.

  3. #3
    Membre averti
    Homme Profil pro
    Amateur / Programme pour le plaisir
    Inscrit en
    Juillet 2024
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Amateur / Programme pour le plaisir

    Informations forums :
    Inscription : Juillet 2024
    Messages : 15
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Par ailleurs, il est toujours préférable de respecter le type des colonnes lors des insertions et mises à jour. Si les colonnes `PrixOfficiel`, `AchatEnCours`, `AchatUrgent` et `ASupprimer` sont de type numérique, c'est la valeur 0 qu'il faut leur affecter et non la chaîne '0'.
    Sinon :
    Merci, je viens de résoudre ce petit problème.
    Citation Envoyé par al1_24 Voir le message
    Tu parles d'un identifiant auto-incrémenté ?

    Le plus simple est de ne pas lui attribuer de valeur à l'insertion de la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO `Souhaits` 
        (`TitreMedia`, `InfoComplementaires`, `TypeMedia`, `VendeursTrouves`, `PrixOfficiel`, `AchatEnCours`, `AchatUrgent`, `ASupprimer`)
    VALUES
        ('Test bidonné', '', 'JV', 'AUCUN', '0', '0', '0', '0')
    C'est bien un auto-incrémenté, je n'avait plus le terme en tête. J'ai déjà essayé sans le champ IDSouhaits, mais la requête envoie une erreur : le champ IDSouhaits est manquant.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 602
    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 : 10 602
    Billets dans le blog
    10
    Par défaut
    bonjour,

    Pouvez-vous communiquer le script DDL de création de la table (ordre complet CREATE TABLE)

  5. #5
    Membre averti
    Homme Profil pro
    Amateur / Programme pour le plaisir
    Inscrit en
    Juillet 2024
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Amateur / Programme pour le plaisir

    Informations forums :
    Inscription : Juillet 2024
    Messages : 15
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    bonjour,

    Pouvez-vous communiquer le script DDL de création de la table (ordre complet CREATE TABLE)
    Qu'est-ce qu'un script DDL ? Si c'est le script de création de la table, alors la voici ci-dessous, sinon je vous prie de m'aider à vous aider pour... m'aider.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE `Souhaits` (
      `IDSouhaits` varchar(20) NOT NULL,
      `TitreMedia` text NOT NULL,
      `TypeMedia` varchar(20) DEFAULT NULL,
      `InfoComplementaires` text,
      `VendeursTrouves` text,
      `PrixOfficiel` int(11) NOT NULL DEFAULT '0',
      `AchatEnCours` int(11) NOT NULL DEFAULT '0',
      `AchatUrgent` int(11) NOT NULL DEFAULT '0',
      `ASupprimer` int(11) NOT NULL DEFAULT '0'
    ) ENGINE=InnoDB;

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 602
    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 : 10 602
    Billets dans le blog
    10
    Par défaut
    C'est bien ça le DDL (Data Definition Language) : c'est à dire la partie du langage SQL qui permet de créer (CREATE), modifier (ALTER) ou supprimer (DROP) des objets de la base de données.
    On voit dans ce script que la colonne IDSouhaits n'est absolument pas un identifiant attribué par le SGBD, c'est à dire un identifiant auto-incrémenté pour MySQL, mais un varchar sans valeur par défaut. De ce fait, c'est non seulement un très mauvais type de données pour une clef primaire (encombrant, sensible à la collation, sensible aux changements de longeur en cas de mise à jour de la valeur, et le plus souvent d'un contenu signifiant donc instable), mais aussi une colonne dont la valeur doit obligatoirement être fournie lors de l'insert puisqu'aucune valeur par défaut n'est donnée.

    Remplacez ce type varchar par un type integer avec la propriété auto_increment et le problème sera résolu

    EDIT et j'oubliais l'essentiel : il faut ajouter la contrainte Primary Key sur la colonne IDSouhaits

    Egalement, tant qu'à faire, renommez la table "Souhaits" en "Souhait" et la colonne "IDSouhaits" en "IDSouhait"
    Pour la table : c'est une évidence que toute table peut contenir plusieurs occurrences, le "s" n'est donc pas requis, de plus, le nom de la table vient de "l'individu" au stade conceptuel, matérialisé par le type d'entité. D'où le singulier.
    Pour la colonne : là c'est encore pire, par définition, un identifiant sert à reconnaitre une et une seule ligne dans la table, le "s" est donc interdit !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] SEEK avec un critère plus court que le champ d'index
    Par mihego32 dans le forum Contribuez
    Réponses: 0
    Dernier message: 02/04/2017, 15h41
  2. Réponses: 12
    Dernier message: 25/02/2014, 18h56
  3. [AC-2007] Gestion des doublons avec 2 champs indexés
    Par bestall666 dans le forum VBA Access
    Réponses: 4
    Dernier message: 08/06/2010, 18h53
  4. Dbase indexer un champs caractère avec un champ numérique
    Par BRUNOROB dans le forum Autres SGBD
    Réponses: 1
    Dernier message: 11/04/2007, 16h17
  5. Réponses: 1
    Dernier message: 11/08/2005, 17h33

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