2011-01-17 5 views
1

Je dois créer un numéro de facture au format:numéro unique du document pour le mois

CONSTANT_STRING/%d/mm/yyyy 

mm - mois (deux chiffres) aaaa - Année

Maintenant, le % d est la numéro de la facture dans le mois spécifique. Un autre mot, ce nombre est réinitialisé tous les mois.

Maintenant, je vérifie dans la base de données quel est le nombre le plus élevé du mois en cours. Puis, après son incrémentation, je sauve la rangée.

J'ai besoin que le nombre entier soit unique. Cependant, il arrive parfois qu'il soit dupliqué (deux utilisateurs économisent en même temps).

Des suggestions?

+0

Avez-vous un identifiant unique sur cette table? Tu ne peux pas utiliser ça? ou peut-être un horodatage pour savoir quelle entrée est arrivée en premier? – Duniyadnd

+0

quel moteur de base de données utilisez-vous pour votre table? –

Répondre

2

Mettez un index unique sur le champ et interceptez l'erreur de base de données lorsque vous essayez d'enregistrer la deuxième instance. En outre, différer l'obtention de la valeur jusqu'au dernier moment possible.

1

Une solution est SELECT ... FOR UPDATE, qui bloque la ligne jusqu'à ce que vous la mettiez à jour, mais peut provoquer des interblocages avec une application multitâche serios.

La meilleure façon est d'aller chercher le nombre et l'incrémenter dans une transaction, puis commencer le travail. De cette façon, la ligne n'est pas verrouillée longtemps.

Regardez dans BEGIN WORK et COMMIT.

0

Utilisez la clé primaire (de préférence un INT) de la table de la facture ou attribuer un numéro unique à chaque facture, par exemple, via uniqid.

PS. Si vous utilisez uniqid, vous pouvez augmenter l'unicité en réglant le paramètre more_entropy à true.

0

Définissez l'ID tout en une requête.

$query = 'INSERT INTO table (invoice_number) VALUES (CONCAT(\''.CONSTANT.'\', \'/\', (SELECT COUNT(*) + 1 AS current_id FROM table WHERE MONTH(entry_date) = \''.date('n').'\' AND YEAR(entry_date) = \''.date('Y').'\'), \'/\', \''.date('m/Y').'\'))'; 
Questions connexes