|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Candidat au titre de Membre du Club
![]() Inscription : août 2011 Messages : 16 ![]() |
Bonjour à tous,
je suis actuellement en stage dans une entreprise qui me demande de créer un système de devis en ligne. C'est une entreprise de location, chaque machine et chaque client a son ID (clé primaire) et on me demande de faire en sorte qu'il y ait un préfixe devant chaque ID, du genre CLI0001 pour les clients et MAC0001 pour les machines. Comment faire pour qu'à chaque inscription d'un membre sur une page PHP (INSERT INTO clients), l'id s'auto incrémente ET s'octroie un préfixe ? Vu que id_client est ma clé primaire, elle est unique et ne peut pas avoir deux valeurs, donc je ne suis obligé de la mettre en auto increment, sauf que ça ne fonctionne pas avec les champs de type CHAR -_-... Je ne peux pas mettre en INT vu qu'il y a un préfixe (que je ne sais pas implémenter). Je suis bien au courant de la commande CONCAT mais comment faire que le suffixe ( [...]001 par exemple) soit en auto increment? Je suis en première année donc soyez indulgent :p Merci d'avance ! |
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() Inscription : mars 2005 Messages : 577 ![]() |
Surtout laisse bien tes clés primaires en tant que INT en auto-incrément malheureux!!!!!!
Les SGBD sont souvent plus à l'aise pour manipuler des nombres plutôt que des chaînes pour tes clés primaires et puis comme tu dis, de toutes les façons les clés sont uniques donc tu ne peux pas avoir par exemple CLI0001 ET MAC0001 dans ta base. Donc ce que tu peux faire c'est de rajouter une colonne à ta table (par exemple 'type') qui te dira si tu est dans le cas CLI ou MAC et tu assemble le tout côté PHP uniquement. (voire même avec une vue si tu es un peu feignant ou que ce n'est pas toi qui va gérer la partie cliente). Dans le pire des cas tu crées une colonne (avec un indexe unique) de plus à ta table pour y mettre ton identifiant complet mais garde ta clé primaire numérique!
__________________
Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros! Code C :
|
||
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() Yannick Ingénieur Etudes & Developpements Inscription : février 2006 Messages : 1 125 ![]() |
Je pense qu'il faudrait se poser la question de l’intérêt d'un tel préfixe.
Si c'est pour être affiché dans un document, une simple concaténation suffit lors de la mise en page.
__________________
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) |
|
|
00
|
|
|
#4 | ||
|
Membre Expert
![]() Inscription : mars 2005 Messages : 577 ![]() |
Après pour l'affichage tu peux même faire ta manipulation directement en SQL. Par exemple SELECT concat('CLI', lpad(45, 4, 0)); te retournera CLI0045. (tu peux aussi utiliser une syntaxe en CASE .. WHEN si tu te bases sur une colonne pour connaître le type de préfixe).
__________________
Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros! Code C :
|
||
|
|
00
|
|
|
#5 |
|
Candidat au titre de Membre du Club
![]() Inscription : août 2011 Messages : 16 ![]() |
Tout d'abord merci de m'avoir répondu. Pour le CONCAT et LPAD, j'y avais pensé et je l'ai présenté à ma chef de projet qui a tout refusé... "Ça complique les traitements"... Je suis un peu perdu, car elle voudrait que je fasse une "auto increment" maison, du genre je fais un SUBSTR des chiffres dans les chaines de tous les ID clients, CLI0001 par exemple (donc 1), un SELECT MAX() pour avoir le plus grand (donc le dernier client inscrit), et une incrémentation pour obtenir un nouvel ID pour un nouveau client...
Si ça complique pas le traitement ça... EDIT : Je cite ce qu'elle vient de me dire "Ce sont deux variables qui se déduisent l'une de l'autre dans une même table, cela ne se fait pas en terme de programmation." |
|
|
00
|
|
|
#6 |
![]() ![]() ![]() Cédric DuprezInscription : avril 2002 Messages : 3 823 ![]() |
C'est ça ! Et l'ID maison est généré par un trigger, histoire d'éviter les erreurs potentielles de cohérence...
Encore une qui a parfaitement compris le fonctionnement d'un SGBD...
__________________
Rédacteur / Modérateur SGBD Mes tutoriels et la FAQ MySQL ---------------------------------------------------- Pensez aux balises code et au tag Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
|
|
|
10
|
|
|
#7 |
|
Membre Expert
![]() Yannick Ingénieur Etudes & Developpements Inscription : février 2006 Messages : 1 125 ![]() |
Je vois que votre chef de projet ne connait pas l'utilité d'une clé primaire dans une table. Celle-ci a un but technique et non esthétique.
Rajouter un préfixe (donc constante) à une donnée optimisée, c'est vraiment se compliquer la vie dans le futur (requêtes plus complexes car vous aurez à manipuler des chaines de caractères et surtout bien moins optimisées). Vous aurez aussi donc à modifier la structure de votre table, peut-être même des triggers ou des procédures associées, du code client appelant, bref une petite étude d'impact. Rajouter un préfixe à votre clé primaire, revient à rajouter une colonne dans votre table client qui ne contiendrait que la valeur 'CLI' pour chaque ligne de votre table et tout cela pour vous informer que votre valeur est issue de la table ... client (pas du tout redondant et très utile !!!) Si malgré tout vous n'arrivez pas à faire comprendre cette subtilité à votre chef de projet (qui a l'air de maitriser tous les fondamentaux de la programmation), alors vous pourrez peut-être vous rabattre sur la gestion des triggers afin de générer votre clé primaire (perte de performances bien sûr), et avoir près de vous votre bible sur les chaines de caractères sous MySQL... 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) |
|
|
00
|
|
|
#8 | |
|
Candidat au titre de Membre du Club
![]() Inscription : août 2011 Messages : 16 ![]() |
Citation:
Étant seulement en première année, je n'ai pas encore eu de cours sur les triggers. Si vous connaissez de bons tutos, je suis preneur... C'est mon premier stage en informatique et je suis vraiment très déçu. |
|
|
|
00
|
|
|
#9 | |
![]() ![]() ![]() Cédric DuprezInscription : avril 2002 Messages : 3 823 ![]() |
Citation:
![]() Pour les triggers, commence par jeter un œil dans la documentation de MySQL. C'est un bon point de départ.
__________________
Rédacteur / Modérateur SGBD Mes tutoriels et la FAQ MySQL ---------------------------------------------------- Pensez aux balises code et au tag Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
|
|
|
|
00
|
|
|
#10 |
|
Membre Expert
![]() Yannick Ingénieur Etudes & Developpements Inscription : février 2006 Messages : 1 125 ![]() |
Et conseillez à votre Chef de projet de venir faire un tour de temps en temps sur ce forum
__________________
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) |
|
|
00
|
|
|
#11 |
|
Candidat au titre de Membre du Club
![]() Inscription : août 2011 Messages : 16 ![]() |
J'ai finalement presque réussi en créant une vue max_id qui SUBSTR la valeur MAX() du champ id_client. Cela me donne par exemple le chiffre 3 pour l'id CLI00000003
Je récupère cette valeur avec PHP au moment de l'inscription, ensuite j'en incrémente la valeur et je le CONCAT "CLI" lors de la requete SQL INSERT INTO clients. Cependant, le chef de projet veux absolument que l'id fasse 11 charactères. Le champ est bien spécifié ainsi, sauf que avec mon script j'obtiens "CLI3", je pourrais remplir avec des zéros entre CLI et 3 avec RPAD, mais lorsque lorsque le nombre de clients aura dépassé 10, j'aurais un soucis avec le CHAR(11)... Comment pourrais-je faire pour "remplir" de zéros sans prédéfinir un nombre ? Désolé si ce n'est pas très clair... |
|
|
00
|
|
|
#12 | |
![]() ![]() ![]() Cédric DuprezInscription : avril 2002 Messages : 3 823 ![]() |
Citation:
A lire : http://mysql.developpez.com/faq/?pag..._INCREMENT_max
__________________
Rédacteur / Modérateur SGBD Mes tutoriels et la FAQ MySQL ---------------------------------------------------- Pensez aux balises code et au tag Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
|
|
|
|
00
|
|
|
#13 | |||
|
Membre Expert
![]() Inscription : mars 2005 Messages : 577 ![]() |
Citation:
__________________
Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros! Code C :
|
|||
|
|
00
|
|
|
#14 | |
|
Candidat au titre de Membre du Club
![]() Inscription : août 2011 Messages : 16 ![]() |
Citation:
Elle m'a dit que ce n'avait aucun rapport avec ma base de donnée, que celle-ci se verrouillait automatiquement lorsque plusieurs personnes l'utilisent (??) et que il fallait que j'arrête d'essayer de combler mon manque de technique par des propositions inutiles... Donc si quelqu'un connait une fonction qui permettrais de remplir le champ de zeros entre le préfixe et l'id ... Ce serait sympa... |
|
|
|
00
|
|
|
#15 | |
![]() ![]() ![]() Cédric DuprezInscription : avril 2002 Messages : 3 823 ![]() |
Citation:
Tout d'abord, ce n'est pas la base de données qui se verrouille. Ensuite, la méthode de verrouillage dépend du moteur selon lequel la table est définie. Si c'est InnoDB, le verrouillage s'effectue ligne par ligne, et donc le problème de doublons cité plus haut a toutes les chances de se produire... Si c'est MyISAM, là, le verrouillage s'effectue au niveau de la table, au moment de l'insertion. Il faudra alors éventuellement gérer l'erreur renvoyée par MySQL si la clé existe déjà. Un petit tour dans la doc de MySQL pour s'en convaincre : http://dev.mysql.com/doc/refman/5.0/...l-locking.html
__________________
Rédacteur / Modérateur SGBD Mes tutoriels et la FAQ MySQL ---------------------------------------------------- Pensez aux balises code et au tag Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
|
|
|
|
00
|
|
|
#16 |
|
Membre Expert
![]() Inscription : mars 2005 Messages : 1 565 ![]() |
Quand il y aura des violations de contrainte d'unicité et des deadlocks lors des inserts dans cette table, vous penserez à nous
Et pour compléter ce que dit Ced qui m'a devancé, les comportements de verrouillage changent selon le niveau d'isolation des transactions. Vous devriez rencontrer une violation d'unicité si le niveau d'isolation est repeatable read et des deadlocks s'il est serializable. Mais bon la base se verrouille toute seule donc pas de souci |
|
|
00
|
|
|
#17 | |
|
Membre Expert
![]() Yannick Ingénieur Etudes & Developpements Inscription : février 2006 Messages : 1 125 ![]() |
Citation:
En tout cas, comme le dit ced, si 2 personnes font un SELECT de votre ID avant que celui-ci n'ait été incrémenté, un doublon sera automatique lors de l'insertion par la deuxième personne. Vous pourrez le tester en mettant un point d’arrêt avant votre incrémentation et lançant 2 clients pour faire votre cas... Il vous faudra utiliser la clause FOR UPDATE lors de votre select, afin de ne pas permettre la lecture simultanée de votre ligne. Cependant, vous allez mettre en attente les futures lectures tant que cette dernière n'aura pas été "committée" ... C'est le cas que je vous avais décrit, vous avez un modèle qui ne nécessite pas d’être modifié, mais le fait de vouloir le faire, vous entraine dans une série de développements qui risque de vous coûter cher dans la maitrise du processus global. Bon courage Ps : question subsidiaire, c'est un(e) chef de projet d'une SSII ??
__________________
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) |
|
|
|
00
|
|
|
#18 |
|
Candidat au titre de Membre du Club
![]() Inscription : août 2011 Messages : 16 ![]() |
Je vous remercie à tous pour votre aide, cependant je pense qu'on dépasse mon niveau de débutant là :s
Je ne vais pas essayer de donner mon avis une seconde fois, l'appréciation est une importante partie de ma notation pour ce stage. La réussite du projet sur le long terme n'en est pas une. Et encore merci pour votre aide. Cordialement |
|
|
00
|
|
|
#19 | |||
|
Membre Expert
![]() Inscription : mars 2005 Messages : 577 ![]() |
Citation:
Après bon, c'est vrai que pour un stage il faut éviter de se la mettre à dos, mais par pitié retiens bien sa façon de faire comme une chose à ne jamais reproduire par la suite!!!
__________________
Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros! Code C :
|
|||
|
|
20
|
|
|
#20 |
|
Candidat au titre de Membre du Club
![]() Inscription : août 2011 Messages : 16 ![]() |
Merci encore pour votre aide, je viens vous annoncer que j'ai démissionné... Cette ... femme... m'a poussé à bout, et je suis parti sur le champ. Elle s'occupera de ses clés auto-incrémentées toute seule. J'ai déjà trouvé un stage en Douanes en tant que webdesigner.
Je vous remercie encore pour votre soutien ^^ |
|
|
30
|
Copyright © 2000-2012 - www.developpez.com