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

PHP & Base de données Discussion :

Numérotation automatique défaillante [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Invité
    Invité(e)
    Par défaut Numérotation automatique défaillante
    Bonjour,

    Je rencontre une problème assez cocasse et je ne trouve pas de solution plossible .

    Je m'explique :

    J'ai un base test PHPMyadmin dans la quelle je viens alimenter une table de 60 colonnes. Il y a 2 types de formats , du texte et du numérique selon les colonnes. Il a y bien entendu une clef primaire qui est un numéro automatique. Ce numéro s'incrémente au fur et à mesure de l'alimentation des lignes.

    Sauf que j'en ai découverte une bien bonne en contrôlant les données :

    L'incrémenteur dérappe et me gonfle le compteur .

    Supposons que je pousse une fichier de données de 100 000 lignes. J'aurai un compteur de 1 à 90 000 , rien de 90 001 à 100 000 puis une reprise de 100 001 à 110 000 . C'est comme ci des lignes disparaissaient ou bien qu'il y avait des lignes fantomes.

    Requête SQL que j'utilise pour faire mon import de données :

    Code MYSQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LOAD DATA INFILE 'C:\mondossier\monfichier.csv' 
    replace INTO TABLE matable FIELDS TERMINATED BY ';' ;

    J'ai controlé , j'ai:

    - aucune perte de données car je retrouve bien toutes les lignes dans la base.
    - le compteur augmente de façon aleatoire tout seul, quand je vais dans mes BDD >> ma base >> ma table >> opération >> je contrôle le chiffre afin de m'assurer de la position du compteur qui est 1 fois sur 2 plus loin que le nombre de ligne réelle de la base. (exemple 100 000 ligne en base , 110 000 pour le compteur automatique).
    - aucune ligne vide dans mes fichiers txt ou csv que je pousse dans la table.

    La "trou" dans le comptage est complétement aléatoire , défois c'est 10 lignes pour un gros fichier , comme cela peut être 4000 à 5000 lignes pour un fichier ridicule de 10 lignes.

    Pour information j'alimente ma table via des fichiers CSV ou txt par un .bat qui execute un qbquery mysql.

    Merci de m'aiguiller.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    D'apres les informations qu'on trouve, mysql reserve les id pour l'insertion mais ne reserve pas le nombre exact. Ca peut donc laisser des trous.

    Cependant les id n'ont que l'obligation d'être uniques, pas de se suivrent.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Par défaut
    Salut,
    Je pense que soit lors de la création de ta table tu as forcé le SGBD de commencer la numérotation à partir de 10 soit tu as fait une suppression de 10 lignes auparavant.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par Kasko
    Salut,
    Je pense que soit lors de la création de ta table tu as forcé le SGBD de commencer la numérotation à partir de 10 soit tu as fait une suppression de 10 lignes auparavant.
    Justement non je ne supprime aucune ligne. A la limite j'update les lignes pour test puis je la réinjecte en base pour écraser l'ancienne.

    Citation Envoyé par sabotage
    D'apres les informations qu'on trouve, mysql reserve les id pour l'insertion mais ne reserve pas le nombre exact. Ca peut donc laisser des trous.

    Cependant les id n'ont que l'obligation d'être uniques, pas de se suivrent.
    D'où les approximations du nombre de lignes lors de l'aperçu ?

    C'est vraiment très génant car comment peut procéder à un algorithme sur la base qui demanderait l'utilisation d'une boucle for ?

    Il n'y a pas un moyen de mettre d'une autre manière les "rank" avec " rankcolumn " ou " rankline " du coup ?

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    On ne travaille pas comme ça avec un SGDB justement
    Que veux-tu faire exactement ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Par défaut
    Je vais dire avant même d'importer ton CSV(lors des tests par exemple) t'es sûr que t'as rien supprimé dans ta table et t'as pas aussi ordonné le SGBD de commencer la numérotation à partir de 10?La plupart de temps cela arrive si par exemple l'on exporte sa base ou sa table avec des enregistrements.Donc le jour où l'on importe le même script,par défaut la nouvelle numérotation commence à partir du dernier enregistrement(11 si le dernier enregistrement est 10) sauf si l'on personnalise.Pour ce qui de la mise à jour,je pense pas que ça peut impacter la numérotation sauf si tu touches à l'identifiant.Sinon si j'ai bonne mémoire,quand on exécute un fichier CSV,ce dernier s'assure d'abord que l'identifiant n'existe pas en base avant d'insérer une ligne sinon il passe à l'enregistrement suivant.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par sabotage Voir le message
    On ne travaille pas comme ça avec un SGDB justement
    Que veux-tu faire exactement ?
    Je souhaite que mon id , soit :

    - un numéro affecté de façon automatique
    - l'id doit être égal au numéro de la ligne (si id = 60 000 alors la ligne de données est la 60 000 et pas la 65 000)
    - l'id est à la fois un id est un numéros d'ordre. Exemple dans le cadre de l'execution d'une boucle for.

    Citation Envoyé par Kasko Voir le message
    Je vais dire avant même d'importer ton CSV(lors des tests par exemple) t'es sûr que t'as rien supprimé dans ta table et t'as pas aussi ordonné le SGBD de commencer la numérotation à partir de 10?
    J'ai pris soin de faire comme suit :

    - création d'une nouvelle table
    - injection de X ligne en base
    - maj d'un certain nombre de ligne (dont écrasement des précédentes)
    - ajout de nouvelles lignes

    Citation Envoyé par Kasko Voir le message
    La plupart de temps cela arrive si par exemple l'on exporte sa base ou sa table avec des enregistrements.Donc le jour où l'on importe le même script,par défaut la nouvelle numérotation commence à partir du dernier enregistrement(11 si le dernier enregistrement est 10) sauf si l'on personnalise.Pour ce qui de la mise à jour,je pense pas que ça peut impacter la numérotation sauf si tu touches à l'identifiant.Sinon si j'ai bonne mémoire,quand on exécute un fichier CSV,ce dernier s'assure d'abord que l'identifiant n'existe pas en base avant d'insérer une ligne sinon il passe à l'enregistrement suivant.
    Il est vrai que le second problème (toucher à un numéro auto) m'a déjà conduit à ce que ma numérotation saute et foire. Mais je n'ai pas touché dans ici dans le cas présent du problème actuel.

    On est bien avec ma table test de 100 000 lignes ici .

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Tu me redis ce que tu aimerai du point de vue mysql mais tu ne me dis pas pourquoi.
    Les résultats d'une requête ne se parcoure pas avec une boucle for justement.
    L'id est un reference, pas une position de classement. Dis nous ton besoin fonctionnel exact et on pourra te dire comment le réaliser.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Par défaut
    Citation Envoyé par tanaka59 Voir le message

    J'ai pris soin de faire comme suit :

    - injection de X ligne en base
    - maj d'un certain nombre de ligne (dont écrasement des précédentes)
    - ajout de nouvelles lignes
    Peut-tu nous expliciter cela et si possible nous dire comment t'as fait avec ces lignes au moments où tu veux importer ton CSV?

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Tu me redis ce que tu aimerai du point de vue mysql mais tu ne me dis pas pourquoi.
    Les résultats d'une requête ne se parcoure pas avec une boucle for justement.
    L'id est un reference, pas une position de classement. Dis nous ton besoin fonctionnel exact et on pourra te dire comment le réaliser.
    Un besoin , fonctionnel > pouvoir avoir de manière automatique un numéro pour des tickets , des enregistrement d'action via des opérations logique qui se suivent, via des robots (envoi de mail par un robot d'archivage). L'id était un numéro automatique.

    Ici ce type d'id m'a déjà servi dans le cas d'une analyse temporelle continue. Il est a la fois id de période et variable dans un calculs multi variées. Comme on se sert d'un id automatique qui est aussi une variable pour alimenter le tableau d'analyse il ne peut y avoir aucun trou. Par exemple une anova, une analyse temporelle avec le trend, obligatoirement il faut identifier les périodes qui se suivent.

    Citation Envoyé par Kasko Voir le message
    Peut-tu nous expliciter cela et si possible nous dire comment t'as fait avec ces lignes au moments où tu veux importer ton CSV?
    1) je créé un table dans phpmyadmin
    2) je créé un bat pour exécuter un qbquery
    3) je créé un qbquery avec la requête mysql
    4) je crée une requête avec load data pour charger la table
    5) j'exécute le bat pour exécuter le qbquery qui va lui même exécuter la requête mysql pour charger les données dans phpmyadmin

  11. #11
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Tu peux numéroter tes résultats de requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select @position:=@position+1 position, colonneA, colonneB FROM table, (SELECT @position:=0) p;
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bonsoir ,

    Je prend bonne note des informations sur la numérotation automatique de PHPMyAdmin qui est aussi aléatoire. Pas très fiable comme système en effet.

    Quoi qu'il en soit je note la chose sous le coude c'est toujours très important de le savoir !

    Je testerai la requête avec numéro de position

    Merci des aiguillages

  13. #13
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Elle est fiable : elle fourni un id de référence unique.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Elle est fiable : elle fourni un id de référence unique.
    Pour donner un id elle est fiable .

    S'en servir comme compteur automatique n'est pas fiable (dixit : numéroter des tickets de demandes utilisateurs par exemple ) . Avec des trous dans la numérotation cela ne permets d'avoir une numérotation fiable . Si il y a 4000 tickets utilisateurs et que le compteur dit 4500 alors ce cas fonctionnel prouve la non fiabilité du numéro automatique.

  15. #15
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    L'id n'est pas fait pour compter des lignes, donc il est fiable.
    C'est comme si tu me disais qu'une fourchette n'est pas fiable car tu n'arrives pas à peindre avec.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  16. #16
    Invité
    Invité(e)
    Par défaut
    L'algorithme qui numérote les id n'est pas très fiable.

    Depuis quand une numérotation comporte des tous ? Quand tu utilises un incrementeur le pas définit est bien de 1 en 1 . Et non de 1 en 1 puis 1 en 5 , puis 1 en 10 et de nouveau 1 an 1 ... Cela n'a pas de sens !

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

Discussions similaires

  1. Numérotation Automatique Personnalisée
    Par Dhumkazaar dans le forum Access
    Réponses: 4
    Dernier message: 10/05/2006, 21h34
  2. Numérotation automatique sous-formalaire
    Par stephane_37 dans le forum Access
    Réponses: 1
    Dernier message: 23/01/2006, 18h05
  3. [JTable] Numérotation automatique des lignes...
    Par lilou77 dans le forum Composants
    Réponses: 2
    Dernier message: 20/12/2005, 11h29
  4. Numérotation automatique de ligne
    Par jag2005 dans le forum Langage
    Réponses: 6
    Dernier message: 02/10/2005, 13h03
  5. Numérotation automatique selon les utilisateurs
    Par Safaritn dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 12/08/2005, 15h11

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