Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes 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 22/08/2011, 11h05   #1
Candidat au titre de Membre du Club
 
Inscription : août 2011
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2011
Messages : 16
Points : 13
Points : 13
Par défaut CONCAT un prefixe défini à un ID (Primary & auto increment)

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 !
gogetenk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2011, 13h30   #2
Membre Expert
 
Avatar de kain_tn
 
Homme
Inscription : mars 2005
Messages : 577
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations forums :
Inscription : mars 2005
Messages : 577
Points : 1 209
Points : 1 209
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 :
1
2
3
4
5
6
7
#include <stdio.h>
 
int main(int argc, char **argv) {
 
    printf("So long, and thanks for the fish, Dennis...\n");
    return 0;
}
kain_tn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2011, 13h32   #3
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
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)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2011, 13h36   #4
Membre Expert
 
Avatar de kain_tn
 
Homme
Inscription : mars 2005
Messages : 577
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations forums :
Inscription : mars 2005
Messages : 577
Points : 1 209
Points : 1 209
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 :
1
2
3
4
5
6
7
#include <stdio.h>
 
int main(int argc, char **argv) {
 
    printf("So long, and thanks for the fish, Dennis...\n");
    return 0;
}
kain_tn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 09h11   #5
Candidat au titre de Membre du Club
 
Inscription : août 2011
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2011
Messages : 16
Points : 13
Points : 13
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."
gogetenk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 09h50   #6
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
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
ced est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/08/2011, 09h50   #7
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
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)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 10h26   #8
Candidat au titre de Membre du Club
 
Inscription : août 2011
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2011
Messages : 16
Points : 13
Points : 13
Citation:
Envoyé par Yanika_bzh Voir le message
Rajouter un préfixe a votre clé primaire, revient a 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 !!!)
C'est exactement ce que je lui ai proposé, c'était le seul moyen que j'ai trouvé d'arriver à ses fins. Et comme je l'ai dis plus haut, elle a tout refusé car en effet, c'est redondant et inutile.

É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.
gogetenk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 10h56   #9
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
Citation:
Envoyé par gogetenk Voir le message
C'est mon premier stage en informatique et je suis vraiment très déçu.
Ça fait partie de l'apprentissage...

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
ced est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 11h22   #10
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
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)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 13h05   #11
Candidat au titre de Membre du Club
 
Inscription : août 2011
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2011
Messages : 16
Points : 13
Points : 13
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...
gogetenk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 13h23   #12
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
Citation:
Envoyé par gogetenk Voir le message
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.
Là, tu risques un sérieux problème... Si deux inscriptions se font à peu près en même temps, la dernière valeur récupérée sera alors la même, l'incrémentation aussi et du coup le code sera le même...
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
ced est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 13h54   #13
Membre Expert
 
Avatar de kain_tn
 
Homme
Inscription : mars 2005
Messages : 577
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations forums :
Inscription : mars 2005
Messages : 577
Points : 1 209
Points : 1 209
Citation:
Envoyé par Yanika_bzh Voir le message
Et conseillez à votre Chef de projet de venir faire un tour de temps en temps sur ce forum
Oui, ou bien de changer de métier et de se cantonner à la gestion de projet pure
__________________
Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


Code C :
1
2
3
4
5
6
7
#include <stdio.h>
 
int main(int argc, char **argv) {
 
    printf("So long, and thanks for the fish, Dennis...\n");
    return 0;
}
kain_tn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 14h43   #14
Candidat au titre de Membre du Club
 
Inscription : août 2011
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2011
Messages : 16
Points : 13
Points : 13
Citation:
Envoyé par ced Voir le message
Là, tu risques un sérieux problème... Si deux inscriptions se font à peu près en même temps, la dernière valeur récupérée sera alors la même, l'incrémentation aussi et du coup le code sera le même...
A lire : http://mysql.developpez.com/faq/?pag..._INCREMENT_max
Merci beaucoup pour cette FAQ que j'ai montrée au chef de projet.
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...
gogetenk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 14h55   #15
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
Citation:
Envoyé par gogetenk Voir le message
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 (??)
C'est faux !
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
ced est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 15h14   #16
Membre Expert
 
Inscription : mars 2005
Messages : 1 565
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2005
Messages : 1 565
Points : 2 178
Points : 2 178
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
vmolines est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 15h22   #17
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
Citation:
Envoyé par gogetenk Voir le message
Merci beaucoup pour cette FAQ que j'ai montrée au chef de projet.
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...
Votre chef de projet, non seulement d'exposer ses lacunes techniques (cela peut arriver mais dans ce cas on accepte la critique) a en plus la parfaite attitude de vous motiver et de titiller votre esprit critique dans la recherche de solutions...

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)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 15h29   #18
Candidat au titre de Membre du Club
 
Inscription : août 2011
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2011
Messages : 16
Points : 13
Points : 13
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
gogetenk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 11h15   #19
Membre Expert
 
Avatar de kain_tn
 
Homme
Inscription : mars 2005
Messages : 577
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations forums :
Inscription : mars 2005
Messages : 577
Points : 1 209
Points : 1 209
Citation:
Envoyé par gogetenk Voir le message
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
Ne te laisse pas impressionner pour autant, j'ai l'impression que ta chef est encore plus débutante que toi vu toutes les #$@! qu'elle te débite...

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 :
1
2
3
4
5
6
7
#include <stdio.h>
 
int main(int argc, char **argv) {
 
    printf("So long, and thanks for the fish, Dennis...\n");
    return 0;
}
kain_tn est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 28/08/2011, 18h09   #20
Candidat au titre de Membre du Club
 
Inscription : août 2011
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2011
Messages : 16
Points : 13
Points : 13
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 ^^
gogetenk est déconnecté   Envoyer un message privé Réponse avec citation 30
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h37.


 
 
 
 
Partenaires

Hébergement Web