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 :

Vérifier qu'un ID n'est pas sauté


Sujet :

Requêtes MySQL

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 146
    Points : 42
    Points
    42
    Par défaut Vérifier qu'un ID n'est pas sauté
    Bonjour,
    J'ai une table contenant plus de 2000 données.
    Chaque données (ou ligne, j'ai oublié le nom... -_-) contiennent un ID, logiquement de 0 à X.

    Sachant que je supprime parfois une donnée ou deux, j'aimerais savoir comment faire pour détecter si un ID a sauté. (Exmple, il y a 0, 1, 2 puis 4, sans 3)

    Et une seconde question, j'aimerais savoir ce qui est le mieux : avoir une base de donnée contenant beaucoup de tables et des données bien triées, ou une base de donnée contenant qu'une seule table et des données mal triées, en rapport optimisation/organisation.


    Merci de vos réponses !

  2. #2
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Bonjour,
    Bonjour,

    J'ai une table contenant plus de 2000 données.
    Chaque données (ou ligne, j'ai oublié le nom... -_-) contiennent un ID, logiquement de 0 à X.
    Ligne ca ira je pense

    Sachant que je supprime parfois une donnée ou deux, j'aimerais savoir comment faire pour détecter si un ID a sauté. (Exmple, il y a 0, 1, 2 puis 4, sans 3)
    Pourquoi as tu besoin de cette information? De toute façon si certaine donnée sont supprimer cela ne changera pas que ton id est unique!

    Et une seconde question, j'aimerais savoir ce qui est le mieux : avoir une base de donnée contenant beaucoup de tables et des données bien triées, ou une base de donnée contenant qu'une seule table et des données mal triées, en rapport optimisation/organisation.
    Surtout pas qu'une seul table! Plus il y a de table mieux c'est tant au niveau organisation qu'en optimisation

    Merci de vos réponses !
    de rien

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 146
    Points : 42
    Points
    42
    Par défaut
    Salut, j'ai créé un script pour une application, et le système fait que je ne dois pas avoir de saut d'ID pour que cela fonctionne correctement...

    Merci

  4. #4
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Salut,
    re salut

    j'ai créé un script pour une application, et le système fait que je ne dois pas avoir de saut d'ID pour que cela fonctionne correctement...
    Regarde ici

    Merci
    De rien

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 146
    Points : 42
    Points
    42
    Par défaut
    Merci, mais moi je ne peux pas utiliser l'import, car je voudrais le faire directement dans un script. (donc un code SQL).

  6. #6
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Merci,
    De rien

    mais moi je ne peux pas utiliser l'import, car je voudrais le faire directement dans un script.
    snif dommage, ma solution ne te convient donc pas

    (donc un code SQL).
    J'ai une solution barbare (je ne baisse pas les bras mais remonte les manches)
    Il suffit de récupérer tous les nombres de 1 jusqu'à ton id MAX et de récupérer tous les id qui ne sont pas dans ta table!

    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT ALL.n 
    FROM
    (
    select n
    -- liste des nombres de 0 à id MAX
    )ALL
    LEFT JOIN
    (
    SELECT id, champ_temoin
    FROM maTable
    )ID ON ID.id = ALL.n
    WHERE champ_temoin IS NULL

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 146
    Points : 42
    Points
    42
    Par défaut
    Merci beaucoup!

    (Je vais faire des grand espaces, pour t'aider à faire tes quotes )

    Le seul problème est... que je n'ai pas vraiment compris comment marche ton script. Je sais juste faire des SELECT, UPDATE et autre fonctions basiques

  8. #8
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Merci beaucoup!
    De rien beaucoup (ca ne se dit pas ca?)
    (Je vais faire des grand espaces, pour t'aider à faire tes quotes )
    enfin quelqu'un qui pense à moi :p

    Le seul problème est... que je n'ai pas vraiment compris comment marche ton script. Je sais juste faire des SELECT, UPDATE et autre fonctions basiques
    Utilise tu du java ou du PHP pour construire ta requête?

    Sinon tu n'a pas besoin d'autre chose qu'un simple select!
    Quel partie ne comprend tu pas?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (
    SELECT n
    -- liste des nombres de 0 à id MAX
    )ALL
    Ceci te créer une table avec tout les nombre de 1 à ton id MAX (à toi d créer la requête qui fait ca, avec du php ou autre langage c'est tres simple)

    Ceci permet de ne pas supprimer les données si la jointure ne fonctionne pas mais plutot de placer les autres éléments à null d'où ma condition dans le where
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    (
    SELECT id, champ_temoin
    FROM maTable
    )ID
    Ceci te récupère tous tes id

    Ta jointure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE champ_temoin IS NULL
    Ta condition qui va t'enlever les id existant puisque le champ temoin est un champ non nulle de ta table

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 146
    Points : 42
    Points
    42
    Par défaut
    Ok, et à quoi sert la lettre "n" ?

  10. #10
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Ok, et à quoi sert la lettre "n" ?
    Cette lettre corespond à tes chiffres de 1 à id MAX.
    Apres tu peux l'appeler comme tu veux c'est ta requête

    En gros cette requête resemblera à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Select 1 as n UNION ALL
    Select 2 UNION ALL
    Select 3 UNION ALL
    Select 4 UNION ALL
    .
    .
    .
    -- jusqu'à id MAX
    et pour le dernier tu ne met pas UNION ALL

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 146
    Points : 42
    Points
    42
    Par défaut
    Ah, donc il faut que je fasse une boucle qui répète la ligne
    "SELECT x UNION ALL" id_max fois ?

  12. #12
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Ah, donc il faut que je fasse une boucle qui répète la ligne
    "SELECT x UNION ALL" id_max fois ?
    Exactement!

    Ca donnerait ca (attention c'est du pseudo code il y a des fautes):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $sql = "SELECT ALL.n FROM ("
     
    $query = mysql_query("SELECT MAX(id) as 'max' FROM maTable");
     
    for ($i = 0; i < $query('max'); i++)
    {
    	$sql.= "SELECT " $i + 1;
    	if ($i == 0)
    		$sql.="as n"
    	if ($i < $query('max'))
    		$sql.=" UNION ALL "
    }
    $sql.= ")ALL LEFT JOIN ( SELECT id, champ_temoin FROM maTable)ID ON ID.id = ALL.n"
    ."WHERE champ_temoin IS NULL"
    Et lorsque tu executera ton $sql ca te renverra la liste des id sautés
    Ahhhh bidouillage quand tu nous tiens!

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 146
    Points : 42
    Points
    42
    Par défaut
    Merci beaucoup, je pourrais ensuite faire un "UPDATE table SET ID = ID-1 WHERE ID > id_sauté"

    ?

  14. #14
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Merci beaucoup, je pourrais ensuite faire un "UPDATE table SET ID = ID-1 WHERE ID > id_sauté"

    ?
    Mwé je ne pense pas que ca marchera! Ton but est de décaler la ligne où je ne comprend pas vraiment le but finale du coup!
    Je pensais que tu voulais stocké ces id pour pouvoir insérer à cette endroit sans problème!!!

  15. #15
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Ne pas jouer avec les identifiants !

    L'identifiant est une clé primaire d'une table issue d'une entité du modèle conceptuel de données et sert de clé étrangère dans les autres tables associées à la première. Si tu modifies un identifiant, tu perds la cohérence des données dans les autres tables qui référencent cet identifiant.

    Et comme l'identifiant est une clé purement interne au SGBD et que l'utilisateur de l'application n'a pas à connaître, on s'en fout que ce soit 1, 2, 3, 4 ou 221, 354, 1852, 4569 ! Le SGBD s'y retrouvera toujours tant que l'identifiant reste invariable.

    Explique davantage pourquoi tu veux faire ça et on te dira comment faire autrement.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  16. #16
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Ce genre de demande (rupture de numerotation) a été traité dans un sujet plus ancien : ici , peut etre que cela vous permettra d'arriver a vos fins ...

    Bon courage
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 146
    Points : 42
    Points
    42
    Par défaut
    Ah, super! Merci Yanika !
    La solution était assez simple.
    Merci à tous

    PS. J'avais aussi une petite question, je ne pense pas créer une topic pour ça :
    Est-il possible de créer une table avec 100 à 200 colonnes ? Si oui, est-ce que les performances se dégraderons beaucoup plus qu'une table à 20 ou 30 colonnes ?
    Merci

  18. #18
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    100 à 200 colonnes pour une table, ça fait beaucoup et c'est généralement la marque d'un mauvais modèle de données.

    Quelle entité peut avoir 200 attributs différents ?

    Encore une fois, explique davantage ce que tu veux faire, pourquoi tu veux 100 colonnes à ta table, et on te dira comment faire mieux.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 146
    Points : 42
    Points
    42
    Par défaut
    J'utilise ma table pour un jeu, et toutes ces colonnes sont l'inventaire du joueur.
    Et sachant que il y a pas mal d'objets et de place dans son inventaire, il me faut pas mal de colonnes.
    Pour les ID non-unique, ce n'est pas pour des joueurs, mais pour un autre système qui n'a pas besoin d'avoir d'ID unique, simplement pour faire plus joli d'avoir des ID croissants.

  20. #20
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Tu peux placer les objets dans une autres table. Tu dois tres certainement pouvoir diviser ta table en plusieurs! N'hésite pas à avoir plusieurs table et jouer avec l'héritage!

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

Discussions similaires

  1. Vérifier qu'une chaîne n'est PAS un nombre
    Par foxbond dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 06/03/2009, 09h21
  2. vérifier qu'un nombre n'est pas est paire
    Par mokless dans le forum Débuter
    Réponses: 5
    Dernier message: 15/11/2008, 22h16
  3. vérifier qu'un script n'est pas déja lancé
    Par Ganondorf dans le forum Langage
    Réponses: 7
    Dernier message: 16/10/2008, 19h32
  4. Comment vérifier si une structure n'est pas vide
    Par colorid dans le forum Langage
    Réponses: 7
    Dernier message: 09/09/2008, 01h01
  5. Réponses: 6
    Dernier message: 09/01/2008, 12h56

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