Access et les Autonumbers.... => Comment les générer à la main - SQL/NoSQL - Programmation
Marsh Posté le 02-06-2003 à 19:56:44
autant faire :
insert into latable (id, truc, machin) values (select max(id) + 1 from latable, 'truc', 'machin')
Marsh Posté le 02-06-2003 à 20:08:30
ta base de données est accédée par une ou plusieurs personnes? parce que ça change tout. Si on est sûr qu'il n'y a jamais qu'une seule personne, on peut se permettre quelques trucs pas beaux mais autant faire propre et portable tout de suite.
Je suis pour la table externe qui stocke les ID. Le truc c'est de locker la table ou le row à ton usage exclusif, de l'incrémenter, puis de relâcher. Si le lock échoue, c'est qu'un autre utilisateur a déjà locké et il suffit de retenter jusqu'à réussite de l'opération (ou n essais, au choix).
Tu pourras donc pas te passer d'un échanger DB supplémentaire puisque tu stockes les IDs ailleurs
Marsh Posté le 02-06-2003 à 20:11:53
Sinon, il suffit de changer le type de ID, et utiliser un timestamp comme ID.
En espérant que deux personnes ne vont pas écrire une ligne à la même milli-seconde
Marsh Posté le 03-06-2003 à 00:59:28
Concernant le lock, la BDD est multi utilisateur ! Par contre, dans mon code, je ne vias accéder qu'assez peu souvent au "Max ID", et surtout, je vais updater ce dernier qu'une fois que je saurai combien de row je veux ajouter, donc, le temps d'un accès lecture/ecriture, je ne pense pas qu'il y ait quelque conflit que ce soit, donc pas de probleme de coté la !
Par contre, en ce qui concerne la solution de MagicBuzz :
insert into latable (id, truc, machin) values (select max(id) + 1 from latable, 'truc', 'machin')
Le probleme est que je voudrais faire une requete Insert insérant plusieurs rows d'un coup, donc je voudrais savoir comment générer une liste de nombre séquentielle en première colonne...
Juste une autre question : si je voulais locker la table des IDs, comment faudrait t il faire? Il faudrait que je rajoute un field supplémentaire, par exemple un booléen "IsLocked"? Le probleme, c dans le cas ou deux personnes accèdent au lock au meme moment, alors il vont trouver un False en meme temps et vont accéder à la donnée ensemble, non?
Bon, ma question principale concerne tout de meme la génération de la suite de nombre 1,2,3,4,5,6, etc... en premeire colonne de la requete !
Marsh Posté le 03-06-2003 à 02:21:36
Insert as select ?
Ben t'es baisé, tu pourras pas. Access supporte pas les triggers, donc soit tu utilise un autonumber et tu trappes quand tu plantes, soit tu oublies les auto-incrément. Mais tu ne pourras pas générer une suite de constantes dans une même requête.
Marsh Posté le 03-06-2003 à 10:42:07
MagicBuzz a écrit : Insert as select ? |
Ca veut dire que si j'ai un requete SELECT qui me retourne :
xxxx yyyy
rrrr ffff
rrrr gggg
Il me sera impossible d'en avoir une qui me retourne :
1 xxxx yyyy
2 rrrr ffff
3 rrrr gggg
Si c'est le cas, je suis dans...la merde
Je ne vois donc pas de solution à mon probleme qui ne greffe pas les perfs!
Marsh Posté le 03-06-2003 à 10:52:34
Oui. Seul Oracle à ma connaissance permet de s'en sortir, car tu peut utiliser le rowid. (et encore, le rowid ne sera un nombre incrémenté que dans le cas d'une requête avec une jointure ou d'une requête pourtant sur une autre - select from select -, sinon il retourne l'id interne utilisé par oracle pour retrouver la ligne dans la table)
Mais Access ne fournis pas d'équivalent, pas plus que SQL Server à ma connaissance, quant à MySQL, je sais pas, mais j'en doute aussi. (c'est très rarement utilisé, puisque normalement on est censé avoir une génération de l'ID qui marche )
Marsh Posté le 03-06-2003 à 11:30:35
MagicBuzz a écrit : Oui. Seul Oracle à ma connaissance permet de s'en sortir, car tu peut utiliser le rowid. (et encore, le rowid ne sera un nombre incrémenté que dans le cas d'une requête avec une jointure ou d'une requête pourtant sur une autre - select from select -, sinon il retourne l'id interne utilisé par oracle pour retrouver la ligne dans la table) |
D'accord !
Donc, je pense que le mieux pour moi est de générer une petite table intermédiaire, enregistrement par enregistrement, et apres, de faire un append de masse sur la grosse table, au lieu de faire un append row par row sur la grosse table, ce qui aurait vraiment été inefficace !
Merci pour vos réponses,
Yoyo*
Marsh Posté le 02-06-2003 à 17:21:33
Salut!
j'avais posté ici meme il y a queslques temps, à propos d'Access XP et les Autonumbers!
Voilà, depuis ce temps là, mon problème, à savoir Access générant des Autonumber n'importe comment (genre, il va générer 400000 alors que le dernier généré vaut 600000) n'arrête pas de se produire, ce qui fait que mon appli n'arrete pas de planter !
Savez vous si il existe un remède, ou un patch à ceci?
Si ce n'est pas le cas, alors, comme on me l'avait indiqué, je souhaiterais générer ces nombres uniques moi meme... Pour celà, je créerais une nouvelle table, avec un champ et un enregistrement unique, contenant le "next number to generate" ! Ce champ m'indiquera quel nombre je devrais utiliser pour ajouter des enregistrements à ma table principale.
Ainsi, si mon nombre vaut X, et que je sais que je dois insérer dans ma table 50 enregistrements, je mettrais alors ce nombre à jour avec X + 50 -> X !
Ensuite, j'ajouterai mes enregistrements à cette table, ce entregistrements devront avoir des ID allant de X à X + 49... D'autre part, ils seront le résultat d'une requete... Le probleme pour moi est doncle suivant :
Comment faire pour ajouter à cette requete une premiere colonne contenant les nombres de X à X + 49?
Comme tout sera fait en VBA, on peu considérer que je possèderai ce X en tant que variable, je ne serais pas obligé d'aller le chercher enn live dans la table contenant X en live (donc, ma requete, déja compliquée, ne sera aps alourdie !)
Voilà, j'espère avoir été assez clair
Merci,
Yoyo*
Message édité par Yoyo@ le 02-06-2003 à 19:29:57