[résolu] clé primaire auto-incrémentée avec masque de deux caractères?

clé primaire auto-incrémentée avec masque de deux caractères? [résolu] - SQL/NoSQL - Programmation

Marsh Posté le 12-02-2009 à 09:34:01    

Bonjour,
 
Ma question va vous paraître bizarre mais comme le dit le titre, j'aurais aimé savoir si il est possible de faire un masque pour une clé primaire avec auto-incrémentation.
Je m'explique, il faudrait que l'on aie 7 caractères au total, les deux premiers sont des lettres et les 5 derniers seraient des chiffres qui seraient incrémentés.
Exemple: "AAxxxxx" où le "AA" serait le masque et les 5 "x" seraient les chiffres.
 
Avant qu'on me tire dessus, je suis complètement conscient que les deux premières lettres engendrent que le type soit "char" mais y'aurait-il une astuce pour contourner cela?
 
Ceci doit avoir ce format pour un étiquetage d'où cette contrainte.
Je travaille avec PHP donc je pourrais faire un auto-incrément pour la clé et lors de l'insertion dans la base, récupérer la valeur de la dernière clé pour l'insérer dans un champs "identifiant" par exemple et ajouter le masque (il me semble que cela pourrait être une solution) donc si vous avez des idées (constructives), je suis preneur.
Si jamais, je travail avec MySQL Workbench ou EasyPHP ou en commandes SQL...
 
Merci


Message édité par moaaaaa le 13-02-2009 à 12:19:02
Reply

Marsh Posté le 12-02-2009 à 09:34:01   

Reply

Marsh Posté le 12-02-2009 à 09:53:02    

Pourquoi ne pas rajouter le filtre lorsque tu as besoin de la référence.
 
Par exemple, dans ta table tu aurai un enregistrement comme celui ci:
 
ID    DESIGNATION
1             Café
 
Et quand tu veux afficher tu rajoutes ton filtre AA?
 
C'est pas envisageable?

Reply

Marsh Posté le 12-02-2009 à 09:59:02    

aspirateur a écrit :

Pourquoi ne pas rajouter le filtre lorsque tu as besoin de la référence.
 
Par exemple, dans ta table tu aurai un enregistrement comme celui ci:
 
ID    DESIGNATION
1             Café
 
Et quand tu veux afficher tu rajoutes ton filtre AA?
 
C'est pas envisageable?


[:plusun]
Ou alors, tu crées deux champs, un champs Id autoincrémenté, et un champ Etiquetage=VARCHAR2.
 
Pour rappel, une clé primaire est sensément non signifiante...

Reply

Marsh Posté le 12-02-2009 à 10:46:29    

Merci à tous pour vos réponses et pour la rapidité de celles-ci...
 
L'idée du filtre est bonne mais le problème est que nous devrons faire une recherche sur ce champs. Ainsi, si l'utilisateur entre AA00001 pour la recherche, il faudrait supprimer les deux premier caractères et faire la recherche sur les 5 chiffres en contrôlant qu'ils soient numériques si j'ai bien compris ce que tu proposes?
 
Pour la deuxième option qui était de créer deux champs, je devrais faire une recherche en concaténant les deux champs dans la requête? Ou tu me conseillerais de faire une clé double? Sachant que pour l'instant, nous ne traîterons que des objets ayant la valeur "AA" ->
etiquette           id                objet
   AA             00001              un objet
   AA             00002              un autre objet
   AA             00003              un troisième objet
    .                  .                     .
    .                  .                     .
    .                  .                     .
 
avec comme clé primaire etiquette et id?
 
Ces deux solutions sont envisageables et je vous remercie, mais je me demandais si il y avait une moyen plus simple (j'avais déjà réfléchi dans ce sens)...
 
Si il y a d'autres propositions, je reste ouvert et si j'ai pas tout compris, vous pouvez sans autre me renseigner.
 
Merci dans tous les cas.

Reply

Marsh Posté le 12-02-2009 à 11:12:31    

Ben je vois pas comment tu peux faire autrement  [:spamafote]

 

Dans le premier cas, la recherche ne pose pas de problème, il suffit que tu enlève les AA. Et que tu fasses ta recherche.

 

Pour moi c'est le plus simple à mettre en place, une petite fonction et c'est tout.

 

Après l'idée de macgawel est bonne aussi, je pense qu'il voulait dire de faire ca:

 


ID             ETIQUETTE              OBJET
1               AA00001                Truc

 

Et tu fais tes recherches sur le champ étiquette.

 

EDIT: Heu j'ai relu, je pense pas que c'est ca qu'il voulait dire  :whistle: mais ca reste une idée aussi


Message édité par aspirateur le 12-02-2009 à 11:14:44
Reply

Marsh Posté le 12-02-2009 à 11:45:26    

En fait, il faudrait voir un peu la théorie - comment est sensée être construite l'étiquette.
 
Au choix :
1. On a une table

ID Objet
 1 Truc
 2 Bidule


Et on construit l'étiquette en php.

Code :
  1. $etiquette="AA".$id;


 
2. On a directement l'étiquette dans la table

ID Objet  Etiquette
 1 Truc   AA00001
 2 Bidule BB00001


Avantages :
- comme dans l'exemple, on dissocie l'étiquette de l'identifiant.
- on conserve le principe de l'Id non signifiant.
- on simplifie la gestion des étiquette
Inconvénient : on rajoute un champ

Reply

Marsh Posté le 12-02-2009 à 11:56:02    

100% d'accord  :jap:  
 
Je préconise la solution 2  [:panzemeyer]

Reply

Marsh Posté le 12-02-2009 à 12:05:54    

Ok, merci à tous,
 
Je vais effectivement faire comme la 2ème proposition de macgawel, ça me semble être le plus judicieux (je n'enlève rien à ta proposition aspirateur  ;) ).
 
Euh... question bête, je ne trouve nulle part comment mettre le problème comme étant "résolu"   :??:  
 
Merci encore pour vos lumières  :jap:  
 
++
 

Reply

Marsh Posté le 13-02-2009 à 11:15:50    

Pour mettre [resolu] il te suffit d'éditer ton premier message et de modifier le titre.
Pour ta question, je passe trop tard, les bonnes solutions t'ont déjà été donné et t'en as choisit une. Par contre, vu la solution que t'as choisit, n'hésite pas à te faire une table de compteur pour ne pas perdre trop de temps dans des 'select max(etiquette) from matable where etiquette like "AA%" '.

Reply

Marsh Posté le 13-02-2009 à 12:17:51    

Merci à vous tous pour le temps que vous avez pris à me répondre...
 
Sinon, voici la méthode finale que j'ai choisi:
 
J'ai mis un ID que j'incrémente avec le code PHP lors d'une nouvelle insertion en regardant la valeur maximale qui est présente dans la BDD. Puis, lors de l'insertion de la nouvelle entrée, je concatène cet ID avec l'étiquette et j'ajoute cela dans un deuxième champ de la table. Ceci permet à l'utilisateur de faire un recherche sur l'étiquette et sur l'ID sans avoir à se préoccuper de l'ID...
 
Pour ceux que ça intéresse, voici le code:
 

Code :
  1. $db->connexionBase();
  2. $objet= $db->selectRow('MAX(id)', 'objet', '');
  3. $db->deconnexionBase();
  4. $_SESSION['id'] = $id[0] + 1;
  5. $etiquette = 'AA' . $_SESSION['id'];
  6. $_SESSION['etiquette'] = $etiquette;


 
Si jamais, les sessions sont là pour passer les objets d'une page à l'autre ou lors de la recharge du formulaire (pas que vous vous étonniez  :pfff: ) et la méthode selectRow() est une méthode créée pour faire un SELECT standard en passant les différents paramètres -> contient la fonction mysql_fetch_row()
 
++

Reply

Sujets relatifs:

Leave a Replay

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