2010-07-14 2 views
7

Nous savons que l'ID d'une table est de type entier et que l'auto-incrémentation dans cette table est correcte. Mais mon problème est que je veux incrémenter une combinaison de chaîne et entier. Par exemple Chaîne: ABC est le code de départ de l'identifiant unique.Auto-incrémentation de l'ID de table en utilisant la combinaison de chaînes dans la base de données automatiquement

Première Id de ma table devrait être la clé primaire et

-à-dire ABC10001, ABC10002, ..... et ainsi de suite.

Sans utiliser une autre clé pour l'auto-incrémentation. S'il vous plaît ne pas utiliser deux types de clé unique.

+0

Pourquoi la clé primaire nécessite-t-elle un préfixe? Ne pouvez-vous pas l'ajouter dans la couche d'application lors de l'interrogation ou de l'affichage? –

+0

Cela ressemble beaucoup à cette question: [Comment ajouter une série de chaîne dans l'incrémentation id dans un tableau?] (Http://stackoverflow.com/questions/3228460/how-to-add-a-series-of- string-in-incrementing-id-in-any-table) Une clé alphanumérique auto-incrémentée dans MySQL n'est pas, autant que je sache, possible. Vous auriez à écrire votre propre générateur de séquence, peut-être dans un déclencheur. Mais cela semble être une solution folle! – Mike

+0

Clé primaire est elle-même une clé unique, mais même je souhaite tracer la clé unique sous la forme d'une chaîne. Supposons qu'une table d'employé contienne l'enregistrement d'un employé, commence à partir de 1 mais je veux commencer à partir de EMP-0001, comme ceci ... Pour le rendre unique et lisible. – Rubyist

Répondre

8

Vous ne pouvez pas le faire dans une seule colonne, sauf si vous spécifiez un déclencheur BEFORE INSERT qui le préfixerait, vous laissant entièrement à l'esprit pour éviter toutes les conditions de course que l'auto_increment gère seul. auto_increment ne peut être utilisé que sur des colonnes entières ou à virgule flottante. À mon avis, «exiger» le PK a un format spécifique, et «juste avoir l'incrément automatique» sont mutuellement exclusifs.

Cela ne signifie pas que vous ne pouvez pas 'faux' sur Selects:

SELECT CONCAT('ABC1',LPAD(id,5,'0')) FROM tablename; 
+0

Man vous économisez mon temps. Merci beaucoup – Ivan

-1

Alternativement à la réponse de Wrikken, vous pouvez sélectionner le 'suivant' la valeur de la db:

SELECT LPAD(max(substr(id, 5)) +1, 4, '0') FROM tablename 

Et puis utilisez cette valeur dans votre instruction d'insertion suivante.

+0

Ce qui ne serait pas une solution acceptable 'telle quelle', il en faut beaucoup plus pour éviter les conditions de course. – Wrikken

0

Ce serait une mauvaise idée de l'implémenter. Vous devrez déterminer la prochaine valeur manaully et ensuite vous êtes soumis aux conditions de course. Cela peut causer de sérieux problèmes d'intégrité des données qui sont impossibles à résoudre si vous n'obtenez pas exactement cela. Cependant, si vous voulez simplement afficher le numéro avec le nom du client, c'est possible mais les numéros ne seront pas en séquence pour un client. (J'utilise le client comme exemple, je ne sais vraiment pas ce que vos préfixes signifient), donc si ABC001, DEF002, ABC003 est acceptable alors concaténer juste pour obtenir le nombre de votre identification réelle automatisée.

Questions connexes