Wie kann ich den nächsten freien Primärschlüssel eines Modells kennen?Modell nächster verfügbarer Primärschlüssel
Antwort
Auch wenn Sie den nächsten verfügbaren Primärschlüsselwert abfragen können, würde es Ihnen nicht helfen. Wenn Sie die Tabelle nicht sperren, können Sie diesen Wert nicht verwenden, bevor er von einem anderen Datenbank-Client für die Einfügung abgerufen wird.
Stattdessen sollten Sie einfach Ihre Zeile einfügen, und dann können Sie den letzten Schlüsselwert abfragen, der während Ihrer aktuellen Sitzung generiert wurde. Jede Datenbank, die automatisch generierte Primärschlüssel unterstützt, bietet eine Methode zum Abrufen des zuletzt während der Sitzung eingefügten Schlüssels.
Der Teil "während Ihrer Sitzung" ist wichtig, da er Ihre Sitzung vor allen Einfügungen schützt, die gleichzeitig von anderen Clients ausgeführt werden. Sie können Schlüsselwerte generieren und Ihre Sitzung wird weiterhin den gleichen Wert es zuletzt eingefügt melden.
@Stuart Childs supposes, dass MySQL die nächste ID mit MAX(column_name)+1
generiert, aber das ist falsch. Angenommen, Sie fügen eine Zeile ein und ein ID-Wert wird generiert. Aber Sie rolle diese Einfügung oder später DELETE
diese Zeile zurück. Beim nächsten Einfügen generiert MySQL einen brandneuen ID-Wert. Der ID-Wert ist also um eins größer als der letzte von einem beliebigen Client generierte ID-Wert, unabhängig davon, welche Zeilen derzeit in der Tabelle gespeichert sind.
Ebenso wenn Sie einfügen, aber nicht sofort verpflichten. Vor dem Festschreiben führt ein anderer Client eine Einfügung durch. Sowohl für Ihre Sitzung als auch für die Sitzung des anderen Clients wird ein eigener eindeutiger ID-Wert generiert. Automatisch generierte Primärschlüssel funktionieren ohne Berücksichtigung der Transaktionsisolation, um die Eindeutigkeit zu gewährleisten.
Automatisch generierte Primärschlüsselwerte werden nicht wiederverwendet oder mehreren Sitzungen zugewiesen, auch wenn Sie Ihre Einfügung noch nicht festgeschrieben haben oder wenn Sie die Einfügung rückgängig machen oder wenn Sie die Zeile löschen.
Ich denke, Sie müssen einige custom SQL ausführen. Die benötigte SQL-Datei ist DB-spezifisch. Soweit ich weiß, gibt es keinen zuverlässigen Weg, dies in MySQL zu tun. Sie können die letzte Einfüge-ID abrufen, sie ist jedoch sitzungsspezifisch (d. H., Sie können die ID des letzten in Ihre DB-Sitzung eingefügten Datensatzes abrufen, aber nicht die letzte ID für eine andere Sitzung, die möglicherweise nach Ihrer passiert ist).
Allerdings (und jemand korrigiert mich, wenn ich falsch liege), MySQL erzeugt die nächste ID mit MAX (column_name) + 1, so dass Sie das gleiche tun könnten.
PostgreSQL macht es viel einfacher mit seiner sequence manipulation functions.
Edit:
Stellt sich heraus, ich dachte an AUTO_INCREMENT
Spalten innerhalb eines multi-column key die sind mit MAX erzeugt (column_name) +1. Allerdings besteht der Punkt immer noch, dass es keine Möglichkeit gibt, die nächste ID vor durch eine Einfügung, die die ursprüngliche Frage war, zu erhalten.
Nein, die ID nicht MAX (Spalten_Name) +1. –
Ja, du hast Recht. Ich hätte nachsehen sollen, da es für jede Multi-User-DB ziemlich schwierig wäre, das zu tun. –
Ich hatte die gleiche Frage, weil ich ein Element duplizierte und ich wollte sein pk zu einem neuen ändern, um es einfügen zu können.
Meine Lösung war wie folgt:
import copy
objectCopy=copy.copy(object)
objectCopy.pk=None
objectCopy.save()
Ich meine, wenn save()
bedeutet es für Sie, warum wollen Sie es manuell tun?
this Schnipsel wird Ihnen sicherlich helfen.
-verwenden Django und Mysql
next_id = Table.objects.filter (id__gt = current_id) [0] .id
- 1. PHP: Nächster verfügbarer Wert in einem Array, beginnend mit einem nicht indizierten Wert
- 2. Eloquent Modell liefert 0 als Primärschlüssel
- 3. iPhone: verfügbarer Speicherplatz
- 4. Maximaler verfügbarer .NET-Speicher?
- 5. Hoch verfügbarer Windows-Dienst
- 6. XPath erster verfügbarer Wert
- 7. MYSQL Nächster Vorheriger Eintrag
- 8. Facebook Connect 'nächster' Fehler
- 9. nächster Vorfahrknoten in jQuery
- 10. WebRTC: Abgleich nächster Peers
- 11. Halten Speicherverbrauch innerhalb verfügbarer Menge
- 12. Liste verfügbarer Datentypen in MySQL
- 13. Interner verfügbarer Speicher im Gerät
- 14. Bester verfügbarer Führer zu Sencha?
- 15. Verfügbarer freier RAM-Speicher C#
- 16. Abrufen verfügbarer Schriftgrößen unter Windows
- 17. Datastax Enterprise-Anzahl verfügbarer Cores
- 18. Graphlab Nächster Nachbar Methode, nicht korrekte Ausgabe
- 19. Nächster Schlüssel in C# Dictionary
- 20. mysql: Reihenfolge nach nächster ID
- 21. Nächster Paar-Algorithmus in JavaScript
- 22. Vba Nächster Geschäftstag Einschließlich Urlaub
- 23. Nächster Nachbar Suche in D3
- 24. Nächster Rückruf im Backbone Router
- 25. erstes Jahr Jahrestag Nächster Monat
- 26. So erstellen Sie ein Modell ohne Primärschlüssel in Schienen
- 27. Verbindung mit einem Modell, das nicht Primärschlüssel id
- 28. Primärschlüssel
- 29. Liste verfügbarer Zeiten von 2 DateTimes
- 30. Fehler wird "verfügbarer Parameter Schlüsselraum überschritten"?
Ah, der Reichtum des Wissens. –
Wow, danke danke für die ausführliche Erklärung. – user20955