Alle Originalinhalte werden auf Ukrainisch erstellt. Noch nicht alle Inhalte wurden übersetzt. Einige Beiträge sind möglicherweise nur auf Ukrainisch verfügbar.Mehr erfahren

Warum überspringt PostgreSQL die ID beim Speichern neuer Einträge? (Heroku)

Beitrags-Cover: Warum überspringt PostgreSQL die ID beim Speichern neuer Einträge? (Heroku)
Dieser Inhalt wurde automatisch aus dem Ukrainischen übersetzt.
Sie überprüfen die letzte ID in der Datenbank, und sie ist unerwartet größer als die tatsächliche Anzahl der Datensätze. Warum passiert das?
In Heroku (und allgemein in PostgreSQL) können ID-Werte aus mehreren Gründen nicht sequenziell sein:

Autoinkrementfeld (serial / bigserial) und Transaktionen

  • In Rails ist die ID normalerweise serial oder bigserial, die eine SEQUENCE zur Generierung einzigartiger Werte verwendet.
  • Wenn die Transaktion, in der die ID zugewiesen wurde, zurückgesetzt wird (ROLLBACK), wird dieser Wert nicht mehr verwendet, aber die SEQUENCE wird weiter inkrementiert. Zum Beispiel, wenn ein Objekt mit id = 4 erstellt wurde und die Transaktion dann zurückgesetzt wird, erhält der nächste Datensatz id = 5, und 4 bleibt übersprungen.

Parallele Abfragen

  • In Cloud-Umgebungen wie Heroku kann es viele konkurrierende Prozesse geben, die gleichzeitig in die Datenbank schreiben.
  • Wenn zwei Abfragen gleichzeitig neue Datensätze erstellen, können sie IDs in unterschiedlicher Reihenfolge erhalten.

Neustart von Dyno (Heroku) und Caching der SEQUENCE

  • PostgreSQL cached die Werte der SEQUENCE, was die Leistung verbessert.
  • Wenn Dyno (Heroku-Server) neu gestartet wird, können die zwischengespeicherten Werte verloren gehen, und PostgreSQL überspringt einige IDs.

Gelöschte Datensätze

  • Wenn Sie Datensätze aus einer Tabelle löschen (DELETE), werden deren IDs nicht wiederverwendet.
  • Zum Beispiel, wenn die IDs 1, 2, 3 vorhanden waren und Sie dann 2 gelöscht haben, wird die nächste ID trotzdem 4 sein.

Wie überprüft man die SEQUENCE?

Führen Sie in der PostgreSQL-Konsole aus:
SELECT last_value, is_called FROM your_table_id_seq;
Oder setzen Sie die Werte manuell zurück:
SELECT setval('your_table_id_seq', (SELECT MAX(id) FROM your_table));
Dies wird die SEQUENCE ausrichten, aber keine Lücken bei bereits erstellten IDs füllen. Dies ist ein normales Verhalten von PostgreSQL. Wenn Sie auf aufeinanderfolgende IDs angewiesen sind, können Sie ROW_NUMBER() verwenden, aber für die Haupt-ID wird dies nicht empfohlen.

Dieser Beitrag hat noch keine Ergänzungen vom Autor.

Was ist Memoization (Beispiele für Ruby und Ruby on Rails)?
20. Feb, 18:16 Uhr

Was ist Memoization (Beispiele für Ruby und Ruby on Rails)?

meme code
meme code@memecode
Was ist Debounce in JavaScript und warum ist es wichtig?
21. Mär, 16:39 Uhr

Was ist Debounce in JavaScript und warum ist es wichtig?

meme code
meme code@memecode
Was ist CFB (Cipher Feedback)?
21. Mär, 16:53 Uhr

Was ist CFB (Cipher Feedback)?

meme code
meme code@memecode
Was ist XOR und wie funktioniert es?
21. Mär, 17:05 Uhr

Was ist XOR und wie funktioniert es?

meme code
meme code@memecode
Embedded-Programmierung: Was ist das und wo fängt man an
24. Mär, 16:48 Uhr

Embedded-Programmierung: Was ist das und wo fängt man an

meme code
meme code@memecode
Pessimistische Sperre in Rails: was ist das und wann sollte man sie anwenden? Welche Alternativen gibt es?
31. Mär, 17:45 Uhr

Pessimistische Sperre in Rails: was ist das und wann sollte man sie anwenden? Welche Alternativen gibt es?

meme code
meme code@memecode
[Codecov] Was ist der Unterschied zwischen Patch- und Projektabdeckung?
09. Apr, 16:03 Uhr

[Codecov] Was ist der Unterschied zwischen Patch- und Projektabdeckung?

meme code
meme code@memecode
Wie helfen Scratch-Kurse Kindern, Soft Skills zu entwickeln?
11. Apr, 18:24 Uhr

Wie helfen Scratch-Kurse Kindern, Soft Skills zu entwickeln?

meme code
meme code@memecode
24. Apr, 20:17 Uhr

Wir fixieren minikube "Sie versuchen, die amd64-Binärdatei auf einem M1-System auszuführen."

meme code
meme code@memecode
24. Apr, 20:55 Uhr

Wir fixieren minikube auf dem Mac mit M1 (wir verzichten auf qemu, starten auf docker)

meme code
meme code@memecode
Wo findet man eine ältere Version von Google Chrome und lädt sie herunter? Am Beispiel eines alten Macs.
25. Apr, 23:02 Uhr

Wo findet man eine ältere Version von Google Chrome und lädt sie herunter? Am Beispiel eines alten Macs.

meme code
meme code@memecode
09. Mai, 19:27 Uhr

[FIXED] kann solche Datei nicht laden -- html/pipeline (LoadError) tritt auf während rails generate thredded:install

meme code
meme code@memecode