Question

Je dois créer un numéro de facture au format:

CONSTANT_STRING/%d/mm/yyyy

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

, % d est le numéro de la facture du mois spécifique. Un autre mots, ce nombre est remis à zéro tous les mois.

Maintenant je vérifie dans la base de données ce qui est le nombre le plus élevé au mois en cours. Puis, après son incrémentation je sauve la ligne.

J'ai besoin du nombre entier d'être unique. Cependant, il arrive parfois qu'il est dupliqué (deux utilisateurs, sauf en même temps).

Toutes les suggestions?

Était-ce utile?

La solution

Mettre un index unique sur le terrain et attraper l'erreur de base de données lorsque vous essayez de sauver la deuxième instance. En outre, obtenir Différer la valeur jusqu'au dernier moment possible.

Autres conseils

Une solution est SELECT ... FOR UPDATE, qui bloque la ligne jusqu'à ce que vous le mettre à jour, mais peut causer Blocages avec un serios application multitâches.

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é pour longtemps.

Regardez dans BEGIN WORK et COMMIT.

A l'aide de 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 la unique en réglant le paramètre de more_entropy à true.

définir l'identifiant en une seule 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').'\'))';
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top