Modell die nächste verfügbare Primärschlüssel
Wie kann ich wissen, die nächsten freien Primärschlüssels einige Modell?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie kann ich wissen, die nächsten freien Primärschlüssels einige Modell?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sogar, wenn Sie die Abfrage können Sie den nächsten verfügbaren Wert des Primärschlüssels, es würde nicht helfen Sie. Wenn Sie die Tabelle sperren, können Sie nicht verwenden Sie diesen Wert, bevor einige andere Datenbank-client greifen Sie für Ihre einfügen.
Stattdessen sollten Sie nur setzen Sie Ihre Reihe, und dann können Sie die Abfrage der letzten Schlüssel-Wert, die während Ihrer aktuellen Sitzung. Jede Datenbank, die Sie unterstützt, automatisch generierte primary keys bietet eine Methode zum abrufen der aktuellsten Schlüssel eingesteckt während Ihrer Sitzung.
Die "während der Sitzung" Teil ist wichtig, denn es schützt Ihre Sitzung von Einsätzen getan wird, die gleichzeitig von anderen clients. Sie können Schlüssel generieren Werte und Ihre Sitzung wird weiterhin über den gleichen Wert es eingefügt, die meisten vor kurzem.
@Stuart Childs vermutet, dass MySQL erzeugt die nächste ID mit
MAX(column_name)+1
aber das ist falsch. Sagen Sie, dass Sie eine Zeile einfügen und einen ID-Wert generiert. Aber rollback Sie diese einfügen, oder späterDELETE
Zeile. Das nächste mal, wenn Sie einfügen, MySQL generieren, eine Marke neue ID-Wert. Also den ID-Wert, der um eins größer ist als die letzten ID-Wert generiert von jedem client, unabhängig davon, welche Zeilen aktuell in der Tabelle gespeichert.Ebenso, wenn Sie legen Sie aber nicht sofort verpflichten. Bevor Sie verpflichten sich, einige andere client hat einen Einsatz. Sowohl Ihre Sitzung und die anderen client-Sitzung haben Ihre eigenen einzigartigen ID-Wert generiert. Automatisch generierte primary keys zu betreiben, ohne Bezug zu Transaktion isolation, um eine Eindeutigkeit sicherzustellen.
Automatisch generierte Primärschlüssel-Werte werden nicht erneut verwendet oder zugewiesen wurden, um mehr als eine Sitzung, auch wenn Sie noch nicht verpflichtet, Ihre Einlage, oder wenn Sie rollback einfügen, oder wenn Sie die Zeile löschen.
-Mit Django und Mysql
next_id = Tabelle.Objekte.filter(id,__gt = current_id)[0].id
Ich hatte die gleiche Frage weil ich duplizieren Sie ein element und ich wollte den Wechsel der pk durch einen neuen ersetzen, um der Lage sein, um es einzufügen.
Meine Lösung war wie folgt:
Ich meine, wenn
save()
bedeutet es für Sie, warum würden Sie wollen, um es manuell tun?next_id = User.objects.order_by('-id').first().id + 1
Möglicherweise behandeln müssen, wenn keiner vorhanden ist.
Oder mit eine max-Abfrage:
next_id = User.objects.all().aggregate(Max('id'))['id__max'] + 1
Denke ich, werden Sie ausführen müssen einige benutzerdefinierte SQL. Die SQL, die Sie benötigen, DB-spezifisch. Soweit ich weiß, gibt es keinen zuverlässigen Weg, dies zu tun in MySQL. Sie können die Letzte insert-ID, aber es ist session-spezifische (D. H. Sie können die ID der letzten Datensatz aus, den Sie eingefügt in deiner DB-session, aber nicht die Letzte ID für eine weitere Sitzung, die stattgefunden haben kann, die nach Ihnen).
Allerdings (und jemand korrigiert mich wenn ich falsch Liege), MySQL erzeugt die nächste ID mit MAX(column_name) + 1, so dass Sie könnte das gleiche tun.PostgreSQL macht es viel einfacher, mit seiner Sequenz-manipulation Funktionen.
Edit:
Stellt sich heraus, ich dachte, der
AUTO_INCREMENT
Spalten innerhalb einer multi-column key die sind generiert mit MAX(column_name)+1. Jedoch, der Punkt steht noch, dass es keine Möglichkeit zum abrufen der nächsten ID vor es wird erzeugt, indem ein insert, das war die ursprüngliche Frage.diese snippet wird sicherlich Ihnen helfen.