Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1670 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  inserer champ dans table MySQL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

inserer champ dans table MySQL

n°864681
manchot fo​u
Posté le 04-10-2004 à 22:56:51  profilanswer
 

Bonjour,
 
J'apprends à me servir d'une base MySQL et j'aimerais avoir quelques explications :
J'utilise plusieurs champs dont un champ ID qui s'incremente automatiquement à chaque insertion d'une nouvelle ligne dans la table (auto_increment). Si j'efface la derniere ligne de la table et que je crais une nouvelle ligne, le nouveau ID ne prend pas la place de l'ancienne ligne mais la ligne suivante. Par exemple, si j'efface la ligne 302, la nouvelle ligne sera 303, et non l'ancienne (302).
Bref comment éviter d'avoir des 'trous' dans la base et que tous les numéros se suivent ? Y A t il une optimisation ou réorganisation de la base à chaque effacement.
 
Merci

mood
Publicité
Posté le 04-10-2004 à 22:56:51  profilanswer
 

n°864683
HappyHarry
Posté le 04-10-2004 à 22:59:12  profilanswer
 

et qu'est ce que ca peut faire qu'il y ait des trous ? :sarcastic:
 
c'est un identifiant, son seul but est d'etre unique [:spamafote]

n°864793
Xav_
The only one...
Posté le 05-10-2004 à 08:52:39  profilanswer
 

tu peux éviter, mais pas avec un auto-incrément.
 
Si tu veux pas de trou, à chaque insertion tu va récupérer l'ID le plus haut, et tu insert ton nouvel enregistrement avec ID = ID_plus_haut + 1
T'es sur de plus avoir de trou à la fin.
 
Celà dis, daccord avec HappyHarry, ça ne pose aucun pb qu'il y ait des trous.
 
Surtout que si tu supprime un enregistrement en milieu de table..., ça va etre un peu chiant de devoir retrouver les ID manquant pour s'en reservir...


Message édité par Xav_ le 05-10-2004 à 08:53:01

---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
n°864828
sircam
I Like Trains
Posté le 05-10-2004 à 09:57:47  profilanswer
 

Xav_ a écrit :

Si tu veux pas de trou, à chaque insertion tu va récupérer l'ID le plus haut, et tu insert ton nouvel enregistrement avec ID = ID_plus_haut + 1
T'es sur de plus avoir de trou à la fin.


Bonne chance pour les accès concurrents !
 [:austinou]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°864861
titione
addicted
Posté le 05-10-2004 à 10:22:46  profilanswer
 

sircam : c quand même ce que fait l'auto_increment par défaut... après c vrai qu'il le fait tout seul au niveau du serveur donc plus rapide mais bon...
on a le même problème quand on veut récupérer le dernier id ajouté avec la méthode mysql_insert_id qui pourtant renvoie bien ce qu'on veut.

n°864886
sircam
I Like Trains
Posté le 05-10-2004 à 10:47:08  profilanswer
 

titione a écrit :

sircam : c quand même ce que fait l'auto_increment par défaut... après c vrai qu'il le fait tout seul au niveau du serveur donc plus rapide mais bon...
on a le même problème quand on veut récupérer le dernier id ajouté avec la méthode mysql_insert_id qui pourtant renvoie bien ce qu'on veut.


Non, ça n'a rien à voir !!!
 
Avec l'autoincrement, le DBMS gère lui-même la question des accès concurrents. Tu peux faire deux inserts "simultanés" sans que cela ne provoque d'inconsistance DB. Tu auras deux records avec deux ID différents.
 
Par contre, si tu lis sans précaution la valeur "max id" et que tu tentes une insertion "avec max id +1", et qu'un tel code peut être exécuté simultanément, tu t'exposes à des problèmes, proportionnels aux contentions sur ta db.
 
L'opération telle que décrite n'est pas atomique !
 
Et le fait d'obtenir la clef primaire du dernier record inséré n'a rien à voir non plus avec un problème d'accès concurrent.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°864979
Xav_
The only one...
Posté le 05-10-2004 à 11:31:00  profilanswer
 

ok, mais moi je répond à la question...
 
Il a dis "comment éviter", j'y ai répondu, maintenant j'ai aussi dis dans mon message que j'étais d'accord avec HappyHarry sur le fait que les trous n'étaient pas génant (autrement dis qu'il vaut mieux les laisser ;))
 
[Xav en a marre de ce genre de post anti-constructif]
J'adore la mentalité de certains ici, se contenter de lire les réponses des autres pour dire que c'est pas bien...
C'est facile de trouver des erreurs dans le réponses des autres, surtout si tu ne site que la partie qui t'interresse...
Mais le but du forum n'est il pas t'apporter des réponses à ceux qui pose les questions ???  
Si j'avais foutu du code avec une erreur dedans et que tu me corrige pour mettre le code qui marche, là j'aurais dis merci de me reprendre... (tu saisi la nuance)
Désolé, j'ai la crève, je tourne à l'aspirine depuis ce matin, c'était pas le jour pour venir critiquer pour rien...  
[/Xav en a marre de ce genre de post anti-constructif]
 


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
n°864993
sircam
I Like Trains
Posté le 05-10-2004 à 11:38:26  profilanswer
 

Xav, prends un Aspegic, suce un Redoxon et prends toi une boisson chaude.  :sol:
 
Tu as répondu à la question, tout va bien, mais j'ai attiré l'attention sur les risques de ta solution alternative.
 
Titione ne semblait pas en mesurer tous les risques, d'où mon explication sur le "maxid" qui pose un sérieux risque pour un utilisateur non-averti, comme sa réponse le montre.
 
Cela n'a rien d'anti-constructif !!!
 
Je mets ta réaction sur le compte de la crève qui sévit. Relis calmement le topic, et relis ta signature aussi :
 

Citation :

ZEN du matin au soir, et du soir au matin...


 
Take it easy man !  [:crosscrusher]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°865043
titione
addicted
Posté le 05-10-2004 à 12:02:28  profilanswer
 

effectivement le risque est non négligeable néanmoins ce que je dis c'est que quand tu utilises mysql_insert_id, tu n'as jamais d'erreur sauf sur les gros systèmes ! à partir de là, ce que voulait faire Xav était jouable même si pas joli du tout !!

n°865168
sircam
I Like Trains
Posté le 05-10-2004 à 14:05:01  profilanswer
 

Les "max id + 1" me semble plutôt être un cas d'école. Ou tu acceptes potentiellement qu'une insertion échoue, ou tu mets en place une mécanisme de correction en cas d'échec (qui fera pire que bien, à tous les points de vue).
 
Bien sûr, avec un "petit" système, ça peut passer, et encore.
 
L'important est juste d'en être conscient, sinon bonjour le debugging quand ton système rate 1 requête sur 100...
 
Autre piste, si on veux éviter l'auto-increment, certains DBMS peuvent fournir une clef primaire unique que tu utiliseras pour ton insertion. Cette clef est garantie unique et se base typiquement sur un timestamp.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  inserer champ dans table MySQL

 

Sujets relatifs
Insérer des données dans une colonneTable + Lien + CSS
Info sur basculement Access/MysqlParcours d'une table de la ligne * à la fin
Perl et mySQLProbleme de casse sur mysql
Conservez le contenu de champ texte sur un formulaireerreur mysql sortie de nul part ???
[VB]Passer une valeur dans une table Access[MySQL] duplication d'une base
Plus de sujets relatifs à : inserer champ dans table MySQL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR