Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/05/2011, 15h30   #1
Candidat au titre de Membre du Club
 
Inscription : mai 2009
Messages : 146
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 146
Points : 13
Points : 13
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 !
ApocKalipsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 16h29   #2
Rédacteur/Modérateur
 
Avatar de David55
 
Homme David S.
Etudiant en alternance
Inscription : août 2010
Messages : 1 167
Détails du profil
Informations personnelles :
Nom : Homme David S.
Âge : 22
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Etudiant en alternance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2010
Messages : 1 167
Points : 2 304
Points : 2 304
Citation:
Bonjour,
Bonjour,

Citation:
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

Citation:
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!

Citation:
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

Citation:
Merci de vos réponses !
de rien
__________________
Vous trouverez ma page perso avec des tutoriels sur Android et BIRT au lien suivant : http://dsilvera.developpez.com
N'oubliez pas de voter pour les messages dont la réponse est pertinente (en bas à droite du cadrant)
Vous voulez afficher du code :
Votre problème est résolu :
Pas de question technique par MP !
David55
David55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 16h38   #3
Candidat au titre de Membre du Club
 
Inscription : mai 2009
Messages : 146
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 146
Points : 13
Points : 13
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
ApocKalipsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 16h55   #4
Rédacteur/Modérateur
 
Avatar de David55
 
Homme David S.
Etudiant en alternance
Inscription : août 2010
Messages : 1 167
Détails du profil
Informations personnelles :
Nom : Homme David S.
Âge : 22
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Etudiant en alternance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2010
Messages : 1 167
Points : 2 304
Points : 2 304
Citation:
Salut,
re salut

Citation:
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

Citation:
Merci
De rien
__________________
Vous trouverez ma page perso avec des tutoriels sur Android et BIRT au lien suivant : http://dsilvera.developpez.com
N'oubliez pas de voter pour les messages dont la réponse est pertinente (en bas à droite du cadrant)
Vous voulez afficher du code :
Votre problème est résolu :
Pas de question technique par MP !
David55
David55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 17h28   #5
Candidat au titre de Membre du Club
 
Inscription : mai 2009
Messages : 146
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 146
Points : 13
Points : 13
Merci, mais moi je ne peux pas utiliser l'import, car je voudrais le faire directement dans un script. (donc un code SQL).
ApocKalipsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 17h40   #6
Rédacteur/Modérateur
 
Avatar de David55
 
Homme David S.
Etudiant en alternance
Inscription : août 2010
Messages : 1 167
Détails du profil
Informations personnelles :
Nom : Homme David S.
Âge : 22
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Etudiant en alternance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2010
Messages : 1 167
Points : 2 304
Points : 2 304
Citation:
Merci,
De rien

Citation:
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

Citation:
(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 :
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
__________________
Vous trouverez ma page perso avec des tutoriels sur Android et BIRT au lien suivant : http://dsilvera.developpez.com
N'oubliez pas de voter pour les messages dont la réponse est pertinente (en bas à droite du cadrant)
Vous voulez afficher du code :
Votre problème est résolu :
Pas de question technique par MP !
David55
David55 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/05/2011, 17h48   #7
Candidat au titre de Membre du Club
 
Inscription : mai 2009
Messages : 146
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 146
Points : 13
Points : 13
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
ApocKalipsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 18h00   #8
Rédacteur/Modérateur
 
Avatar de David55
 
Homme David S.
Etudiant en alternance
Inscription : août 2010
Messages : 1 167
Détails du profil
Informations personnelles :
Nom : Homme David S.
Âge : 22
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Etudiant en alternance
Secteur : High Tech - Éditeur de logiciels

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

Citation:
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 :
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 :
1
2
3
4
5
 
(
SELECT id, champ_temoin
FROM maTable
)ID
Ceci te récupère tous tes id

Ta jointure

Code :
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
__________________
Vous trouverez ma page perso avec des tutoriels sur Android et BIRT au lien suivant : http://dsilvera.developpez.com
N'oubliez pas de voter pour les messages dont la réponse est pertinente (en bas à droite du cadrant)
Vous voulez afficher du code :
Votre problème est résolu :
Pas de question technique par MP !
David55
David55 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/05/2011, 18h10   #9
Candidat au titre de Membre du Club
 
Inscription : mai 2009
Messages : 146
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 146
Points : 13
Points : 13
Ok, et à quoi sert la lettre "n" ?
ApocKalipsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 18h19   #10
Rédacteur/Modérateur
 
Avatar de David55
 
Homme David S.
Etudiant en alternance
Inscription : août 2010
Messages : 1 167
Détails du profil
Informations personnelles :
Nom : Homme David S.
Âge : 22
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Etudiant en alternance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2010
Messages : 1 167
Points : 2 304
Points : 2 304
Citation:
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 :
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
__________________
Vous trouverez ma page perso avec des tutoriels sur Android et BIRT au lien suivant : http://dsilvera.developpez.com
N'oubliez pas de voter pour les messages dont la réponse est pertinente (en bas à droite du cadrant)
Vous voulez afficher du code :
Votre problème est résolu :
Pas de question technique par MP !
David55
David55 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/05/2011, 18h30   #11
Candidat au titre de Membre du Club
 
Inscription : mai 2009
Messages : 146
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 146
Points : 13
Points : 13
Ah, donc il faut que je fasse une boucle qui répète la ligne
"SELECT x UNION ALL" id_max fois ?
ApocKalipsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 18h34   #12
Rédacteur/Modérateur
 
Avatar de David55
 
Homme David S.
Etudiant en alternance
Inscription : août 2010
Messages : 1 167
Détails du profil
Informations personnelles :
Nom : Homme David S.
Âge : 22
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Etudiant en alternance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2010
Messages : 1 167
Points : 2 304
Points : 2 304
Citation:
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 :
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!
__________________
Vous trouverez ma page perso avec des tutoriels sur Android et BIRT au lien suivant : http://dsilvera.developpez.com
N'oubliez pas de voter pour les messages dont la réponse est pertinente (en bas à droite du cadrant)
Vous voulez afficher du code :
Votre problème est résolu :
Pas de question technique par MP !
David55
David55 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/05/2011, 19h03   #13
Candidat au titre de Membre du Club
 
Inscription : mai 2009
Messages : 146
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 146
Points : 13
Points : 13
Merci beaucoup, je pourrais ensuite faire un "UPDATE table SET ID = ID-1 WHERE ID > id_sauté"

?
ApocKalipsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 22h09   #14
Rédacteur/Modérateur
 
Avatar de David55
 
Homme David S.
Etudiant en alternance
Inscription : août 2010
Messages : 1 167
Détails du profil
Informations personnelles :
Nom : Homme David S.
Âge : 22
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Etudiant en alternance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2010
Messages : 1 167
Points : 2 304
Points : 2 304
Citation:
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!!!
__________________
Vous trouverez ma page perso avec des tutoriels sur Android et BIRT au lien suivant : http://dsilvera.developpez.com
N'oubliez pas de voter pour les messages dont la réponse est pertinente (en bas à droite du cadrant)
Vous voulez afficher du code :
Votre problème est résolu :
Pas de question technique par MP !
David55
David55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 10h03   #15
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 000
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 000
Points : 18 265
Points : 18 265
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/05/2011, 17h12   #16
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
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)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2011, 11h27   #17
Candidat au titre de Membre du Club
 
Inscription : mai 2009
Messages : 146
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 146
Points : 13
Points : 13
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
ApocKalipsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2011, 16h24   #18
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 000
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 000
Points : 18 265
Points : 18 265
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2011, 16h58   #19
Candidat au titre de Membre du Club
 
Inscription : mai 2009
Messages : 146
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 146
Points : 13
Points : 13
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.
ApocKalipsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2011, 23h29   #20
Rédacteur/Modérateur
 
Avatar de David55
 
Homme David S.
Etudiant en alternance
Inscription : août 2010
Messages : 1 167
Détails du profil
Informations personnelles :
Nom : Homme David S.
Âge : 22
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Etudiant en alternance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2010
Messages : 1 167
Points : 2 304
Points : 2 304
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!
__________________
Vous trouverez ma page perso avec des tutoriels sur Android et BIRT au lien suivant : http://dsilvera.developpez.com
N'oubliez pas de voter pour les messages dont la réponse est pertinente (en bas à droite du cadrant)
Vous voulez afficher du code :
Votre problème est résolu :
Pas de question technique par MP !
David55
David55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h22.


 
 
 
 
Partenaires

Hébergement Web