2011-06-09 3 views
1

Je souhaite générer des identifiants clients pour les factures et ne souhaite donc pas commencer à compter à partir de 1 pour des raisons évidentes. En MySQL pouvez-vous générer un nombre aléatoire qui est unique?Générer un numéro unique à 10 chiffres

Je connais la fonction RAND(), mais elle ne garantit pas l'unicité. Quelle est la bonne approche pour cela?

ne fonctionne pas:

INSERT INTO test (number) VALUES (FLOOR(0 + (RAND() * 9999999999))); 

PS: côté serveur que je suis en utilisant PHP et générer des factures en utilisant FPDF.

+0

Quelle est la raison évidente ici? Est-ce que les factures seraient visibles d'une manière ou d'une autre si vous deviniez le prochain id, ou spoofable d'une certaine manière? Si c'est le cas, vous avez un problème différent et vous devez vous assurer que toute personne consultant une facture est autorisée à le faire. Au lieu de cela, je voudrais regarder un en utilisant la fonction UUID (voir http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_uuid), bien que cela semble être une surenchère majeure. – muffinista

+0

Non, en fait je ne considère rien à faire avec l'usurpation d'identité etc. C'est plus que l'entreprise est une start-up et ils ne veulent pas révéler que vous êtes leur premier client :-) –

Répondre

4

Je suggère une colonne AUTO_INCREMENT et ensemence la valeur à 10 chiffres. Vous pouvez l'avoir comme seule colonne dans la table, comme ci-dessous, ou plus concrètement ensemencer votre ID de table de facture.

CREATE TABLE tablename (
    id bigint unsigned not null auto_increment, 
    primary key(id), 
    auto_increment=1000000000 
); 
+1

J'aime l'idée, mais le client verrait toujours un 1000000001 et sachez que c'était la première facture ;-) Peut-être que je devrais choisir un nombre aléatoire et partir de là. –

+0

Assez juste. Vous auriez à pré-remplir cette table et marquer les lignes comme * utilisé * alors. Mais évidemment, il y a une limitation à cette solution. –

+0

Je suis maintenant passé à la valeur auto_increment à sth crazy, en espérant que personne ne remarquera jamais qu'ils sont le premier client :-) Merci pour votre aide! +1 –

2

En fait, les raisons ne sont pas si évidente à moins qu'il est tout simplement que vous ne voulez pas que vos clients sachent qu'il ya si peu qu'ils ont tous les ID à un chiffre :-)

En tant de côté, l'ID client est généralement généré lors de l'ajout d'un client au lieu de faire une facture. Si vous vouliez dire un numéro de facture, c'est différent, mais le raisonnement sera le même.

Soit remplir la table avec une entrée fictive avec un ID inférieur approprié (314159 par exemple), puis utiliser quelque chose comme:

insert into test (number) select max(number)+1 from test 

ou utiliser une clé incrémentiel automatique avec une valeur de départ appropriée (encore une fois, cette valeur est à vous, mais vous devriez choisir quelque chose de relativement "non-rond"). J'ai parfois utilisé le premier pour les situations où je veux un contrôle total sur les valeurs assignées (y compris la possibilité de les changer facilement) mais une solution plus robuste serait probablement l'auto-incrément.

0
ALTER TABLE my_invoice_table auto_increment=1000000001 

Les numéros de facture incrémentés sont bien - ils doivent seulement être uniques, pas aléatoires.

Questions connexes