inserer champ dans table MySQL

inserer champ dans table MySQL - SQL/NoSQL - Programmation

Marsh Posté le 04-10-2004 à 22:56:51    

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

Reply

Marsh Posté le 04-10-2004 à 22:56:51   

Reply

Marsh Posté le 04-10-2004 à 22:59:12    

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]

Reply

Marsh Posté le 05-10-2004 à 08:52:39    

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
Reply

Marsh Posté le 05-10-2004 à 09:57:47    

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}
Reply

Marsh Posté le 05-10-2004 à 10:22:46    

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.

Reply

Marsh Posté le 05-10-2004 à 10:47:08    

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}
Reply

Marsh Posté le 05-10-2004 à 11:31:00    

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
Reply

Marsh Posté le 05-10-2004 à 11:38:26    

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}
Reply

Marsh Posté le 05-10-2004 à 12:02:28    

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

Reply

Marsh Posté le 05-10-2004 à 14:05:01    

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}
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed