2010-12-09 40 views
2

Ich war davon wie diese Wie erstelle ich eine Transaktionsnummer?

  • YYYY Typ

    Wo

    • T

      TYYYYMMDDNNNNNNNNNNX (1 Zeichen + 19 Stellen) Formatierung zu denken ist, ist Jahr

    • MM ist Monat
    • DD ist Tag
    • N ist Sequencial Nummer
    • X prüfen ist Ziffer

    Das Problem ist, wie kann ich die sequentielle Nummer generieren? Da mein Primärschlüssel kein Ganzzahlwert für die automatische Inkrementierung ist, würde ich ihn verwenden, aber nicht.

    EDIT kann ich die Sequenznummer nach 1 Tag (24 Stunden) selbst zurücksetzen lassen.

    • P201012080000000001X < - erste Transaktion von 2010.12.08
    • P2010120810000000002X < --- zweiter Transaktion von 2010.12.08
    • P201012090000000001X < --- Erster Transaktion von 2010/
    • 12/09

    (X ist der Prüfziffer)

  • +0

    Können Sie eine Datei verwenden? Einfach die Nummer holen, dann hochzählen und speichern? – SwDevMan81

    +1

    Was sind Ihre Nebenläufigkeitsanforderungen, und gibt es zusätzliche Einschränkungen (z. B. keine Lücken in der Sequenznummer?)? –

    +0

    Sie könnten einfach jedes Element Ihres Strings explodieren, es würde 6 weitere db-Felder benötigen (was Primärschlüssel sein müssten), aber dies würde den Prozess des Generierens des Strings erleichtern, da Sie überprüfen können, ob es heute eine Bestellung gab und Stellen Sie die Sequenznummer entsprechend ein. Sie bearbeiten dann die 6 Felder, um die Zeichenfolge für die Ausgabe zu erstellen. –

    Antwort

    0

    (das Datum bereits in der Transaktionszeile gespeichert wird) Sie scheinen die Formel für Ihre Transaktionsnummer zu haben Die einzige Frage, die Sie wirklich haben, ist, wie Sie eine Sequenznummer erzeugen, die jeden Tag zurückgesetzt wird.

    Sie können folgende Möglichkeiten in Betracht ziehen:

    • eine Datenbank Sequenz verwenden und einen Job geplant, die es zurücksetzt.

    • Verwenden Sie eine Sequenz außerhalb der Datenbank (z. B. eine Datei oder eine Speicherstruktur).

    • Mit der richtigen Isolationsstufe sollten Sie die (SELECT (MAX (Seq) + 1) FROM Tabelle WHERE DateCol = CURRENT_DATE) als Wertausdruck in Ihre INSERT-Anweisung aufnehmen können.

    Beachten Sie auch, dass es wahrscheinlich kein wirklicher Grund, tatsächlich die Transaktionsnummer in der Datenbank zu speichern, wie es einfach ist, es aus den Informationen abzuleiten, es kodiert. Sie müssen nur die fortlaufende Nummer speichern.

    0

    Sie können die Auto-Incs separat verfolgen.

    Oder wie Sie sich bereit machen, eine neue Transaktion hinzuzufügen. Rufen Sie zuerst die DB nach der neuesten Transaktion ab und brechen Sie diese auf, um die Nummer zu finden und diese zu erhöhen.

    Oder fügen Sie ein Auto-Inc-Feld hinzu, aber verwenden Sie es nicht als Schlüssel.

    0

    Sie können einen UUID-Generator verwenden, so dass Sie sich nicht um eine Sequenz kümmern müssen und Sie sicher sind, dass zwischen den Transaktionen keine Kollisionen auftreten.

    zB:

    in java:

    java.util.UUID.randomUUID()

    05f4c168-083a-4107-84ef-10346fad6f58 
    5fb202f1-5d2a-4d59-bbeb-5bcabd513520 
    31836df6-d4ee-457b-a47a-d491d5960530 
    3aaaa3c2-c1a0-4978-9ca8-be1c7a0798cf 
    

    in php:

    echo uniqid()

    4d00fe31232b6 
    4d00fe4eeefc2 
    4d00fe575c262 
    

    dort ist ein UUID-Generator in fast allen Sprachen.

    +0

    GUIDs sind eine sehr schlechte Wahl des Primärschlüssels. Bitte lesen Sie den Beitrag, auf den ich oben Bezug genommen habe. –

    0

    Ein Primärschlüssel, der groß ist, ist eine sehr, sehr schlechte Idee. Sie werden unnötig viel Tabellenplatz verschwenden und Ihren Tisch sehr langsam abfragen und verwalten lassen. Machen Sie den Primärschlüssel zu einem kleinen einfachen Inkrementieren von int und speichern Sie das Transaktionsdatum in einem separaten Feld. Bei Bedarf in einer Abfrage Sie eine Transaktionsnummer für diesen Tag auswählen können mit:

    SELECT ROW_NUMBER OVER (PARTITION BY TxnDate ORDER BY TxnID), TxnDate, ... 
    

    Bitte lesen Sie diese in Bezug auf eine gute Primär wichtigsten Auswahlkriterien. http://www.sqlskills.com/BLOGS/KIMBERLY/category/Indexes.aspx

    +0

    wird nicht als Primärschlüssel verwendet! – 001

    1

    Die Frage ist bedeutungslos ohne Kontext. Andere haben Ihre Frage kommentiert. Bitte beantworten Sie die Kommentare. Was ist die "Transaktionsnummer" für; Wo wird es benutzt? Für welche "Transaktion" benötigen Sie eine externe Kennung?

    Spalten zur Identitäts- oder Autoinkrementierung können intern verwendet werden, sind jedoch außerhalb der Datenbank ziemlich nutzlos.

    Wenn wir das vollständige Schema hätten, wüssten wir, welche Komponenten PKs sind, die sich nicht ändern usw., könnten wir eine sinnvollere Antwort liefern.

    Auf den ersten Blick, ohne die Informationen angefordert, sehe ich keinen Sinn in das Aufnahmedatum in die „Transaktion“