2009-02-16 6 views
1

Quel serait un bon moyen de créer une nouvelle séquence de numéros de série par jour dans une base de données SQL?Une nouvelle séquence SQL par jour

Semblable à la fonction d'incrémentation automatique des colonnes entières dans certains systèmes de base de données.

Je crée/enregistre des transactions, et la transaction est identifiée par la paire «date, numéro de série».

+0

Quel est le problème avec les numéros de série normaux (en augmentation monotone)? – kmkaplan

+0

Ceci est pour un certificat qui contient une date + un numéro de série. Étant donné que la date change toutes les quelques heures, je n'ai pas besoin d'un emplacement aussi grand pour le numéro de série. J'essaie de conserver tous les caractères. –

+0

La plupart des systèmes de base de données ont un mécanisme de séquence que vous pouvez réinitialiser à 0. Quel est votre système de base de données? – kmkaplan

Répondre

0

Le meilleur moyen est d'utiliser la date comme partie du nombre, comme ayant 080216001 à 080216999 pour aujourd'hui. Pouvez-vous avoir des numéros non contigus?

+0

En quelle année êtes-vous? C'est 2009-02-16 pour moi: D Et avons-nous oublié le Y2K si vite? –

1

Cela dépend du type de base de données dont vous disposez. Si vous avez accès à des variables globales ou à des générateurs, réinitialisez-le chaque jour et utilisez-le pour amorcer la colonne de votre numéro de série. Si ce n'est pas le cas, vous pouvez stocker la valeur dans une table et la rechercher pour amorcer votre colonne, en la réinitialisant chaque jour. N'oubliez pas d'incrémenter les graines manuellement si nécessaire. (Les générateurs sont un type particulier de variable globale qui peut s'auto-incrémenter s'ils sont configurés, mais pas les autres variables et certainement un enregistrement dans une table.)

Pour réinitialiser la valeur, il suffit de définir un déclencheur sur l'insertion. cela vérifie si COUNT(DATE = today) est 0. Si c'est le cas, réinitialisez la valeur.

1

Que diriez-vous d'une table spécifique juste à cet effet?

create table AvailableSerialNumbers (
    AvailableOn datetime primarykey, 
    NextAvailableNumber int 
) 

Il faudrait remplir à l'avance, mais c'est assez simple (automatiquement et ne pas faire que cela se fait manuellement).

Notez que si vous avez créé un grand nombre d'enregistrements de numéros de série en même temps, la logique de création goulot sera bloquée lors de la mise à jour de l'enregistrement AvailbleSerialNumbers. La solution la plus simple à ce problème est de définir plusieurs enregistrements AvailableSerialNumbers par jour (disons 100) et de choisir au hasard 1 à mettre à jour. Si vous utilisez cette approche à la place d'un champ "NextAvailableNumber", il doit s'agir d'une plage from/to. Lorsque la plage atteint 0, supprimez l'enregistrement de plage.

Questions connexes