2009-02-24 18 views

Antwort

17

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.

+0

Ah, der Reichtum des Wissens. –

+0

Wow, danke danke für die ausführliche Erklärung. – user20955

-1

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.

+0

Nein, die ID nicht MAX (Spalten_Name) +1. –

+0

Ja, du hast Recht. Ich hätte nachsehen sollen, da es für jede Multi-User-DB ziemlich schwierig wäre, das zu tun. –

0

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?

-1

this Schnipsel wird Ihnen sicherlich helfen.

2

-verwenden Django und Mysql

next_id = Table.objects.filter (id__gt = current_id) [0] .id