2012-03-29 9 views
0

Ich füge eine Reihe von Datensätzen (zB 100) pro einzelne Transaktion. Ich möchte, dass jeder Datensatz ein "Transaktions-ID" -Feld hat, das für jede neue Transaktion erhöht wird und für jeden Datensatz, der innerhalb einer bestimmten Transaktion eingefügt wird, derselbe Wert ist. Ich möchte dies, damit Clients eine Abfrage ausführen können und dann irgendwann die gleiche Abfrage ausführen, aber nur Datensätze mit einer neueren Transaktions-ID abrufen. Was ist der beste Weg, es zu tun? Ich möchte die ID nicht wirklich auf Anwendungsebene generieren, da auf die DB von mehreren Prozessen zugegriffen wird, so dass ich dann die ID-Zuweisung prozessübergreifend koordinieren müsste. Oder ich könnte eine dedizierte TXID-Tabelle mit einer einzelnen Autoincrememt-Spalte haben, einfügen, bevor Sie die Transaktion starten und die letzte_insert_rowid() als TXID verwenden, aber es scheint ein wenig ineffizient zu sein, eine Tabelle mit inkrementierenden Zahlen zu speichern, nur um IDs zu generieren. Irgendwelche Gedanken? Vielen Dank.sqlite: Erzeuge eine Transaktions-ID für Multi-Einfüge-Transaktion

Antwort

1

Wenn Sie eine inkrementierende Ganzzahl wünschen, sollten Sie tatsächlich das tun, was Sie vorgeschlagen haben - eine andere Tabelle, die Transaktions-IDs enthält. Sie können diese Tabelle ziemlich regelmäßig durchstreichen, um die Zeilen zu löschen, obwohl sie sehr klein und effizient sind, so dass dies kein großes Problem sein sollte.

Es gibt eine Vielzahl von anderen möglichen Lösungen, aber wie Sie bereits herausgefunden haben, funktionieren die meisten von ihnen nicht in Ihrer Situation (Möglichkeit von Kollisionen, abhängig von Ihrer erforderlichen Treue). Wenn Sie die Datenbank nutzen müssen, um Eindeutigkeit zu gewährleisten, ist dies die einzige Möglichkeit, dies in SQLite zu tun. Alternativ könnten Sie etwas wie die random oder randomblobfunctions versuchen, aber es gibt natürlich keine Eindeutigkeit Garantien für die PRG gemacht.

Wenn Sie das tun nicht eine monoton steigende integer benötigen, könnten Sie auch eine RFC 4122 UUID auf der Anwendungsebene erzeugen (diese können immer noch Konflikte, jedoch selten, wenn Sie aus vielen Prozessen schreiben - Sie möchten vielleicht auch markieren es mit einem prozessspezifischen String und machen es zu einem URN, etwa wie urn:uuid:<tag>+<uuid>). Wenn sich alle Schreiber auf demselben Computer befinden, reicht die Verwendung von etwas wie pid für ein Tag aus, um die Eindeutigkeit zu garantieren.

+0

Danke für die Antwort. Ich dachte über UUID nach, aber ich muss sicherstellen, dass jede neue ID größer als die letzte ist. Wird die TXID-Tabellenlösung tun. – gimmeamilk