Cała oryginalna treść jest tworzona po ukraińsku. Nie wszystkie treści zostały jeszcze przetłumaczone. Niektóre posty mogą być dostępne tylko po ukraińsku.Dowiedz się więcej

Dlaczego PostgreSQL pomija ID podczas zapisywania nowych rekordów? (Heroku)

Okładka posta: Dlaczego PostgreSQL pomija ID podczas zapisywania nowych rekordów? (Heroku)
Ta treść została automatycznie przetłumaczona z ukraińskiego.
Sprawdzacie ostatni ID w bazie, a on jest niespodziewanie większy niż rzeczywista liczba rekordów. Dlaczego tak się dzieje?
W Heroku (i ogólnie w PostgreSQL) wartości ID mogą być niespójne z kilku powodów:

Pole autoinkrementacyjne (serial / bigserial) i transakcje

  • W Rails ID zazwyczaj jest serial lub bigserial, które używa SEQUENCE do generowania unikalnych wartości.
  • Jeśli transakcja, w której przydzielono ID, zostaje anulowana (ROLLBACK), ta wartość nie jest już używana, ale SEQUENCE jest inkrementowane dalej. Na przykład, jeśli utworzono obiekt z id = 4, a następnie anulowano transakcję, następny rekord otrzyma id = 5, a 4 pozostanie pominięte.

Równoległe zapytania

  • W chmurowych środowiskach, takich jak Heroku, może być wiele konkurencyjnych procesów, które zapisują do bazy jednocześnie.
  • Jeśli dwa zapytania jednocześnie tworzą nowe rekordy, mogą otrzymać ID w różnych porządkach.

Restart Dyno (Heroku) i buforowanie SEQUENCE

  • PostgreSQL buforuje wartości SEQUENCE, co pomaga zwiększyć wydajność.
  • Jeśli Dyno (serwer Heroku) zostanie zrestartowane, buforowane wartości mogą zostać utracone, a PostgreSQL przeskoczy kilka ID.

Usunięte rekordy

  • Jeśli usuwasz rekordy z tabeli (DELETE), ich ID nie są ponownie używane.
  • Na przykład, jeśli były rekordy ID = 1, 2, 3, a następnie usunąłeś 2, następny ID wciąż będzie 4.

Jak sprawdzić SEQUENCE?

Wykonaj w konsoli PostgreSQL:
SELECT last_value, is_called FROM your_table_id_seq;
Lub ręcznie zresetuj wartość:
SELECT setval('your_table_id_seq', (SELECT MAX(id) FROM your_table));
To wyrówna SEQUENCE, ale nie wypełni luk w już utworzonych ID. To normalne zachowanie PostgreSQL. Jeśli potrzebujesz ściśle uporządkowanych ID, możesz użyć ROW_NUMBER(), ale dla głównego ID nie jest to zalecane.
Podoba ci się?Zareaguj
🧵

Ten post nie ma jeszcze żadnych dodatków od autora.

Czym jest Row Security w PostgreSQL i po co jest to deweloperom Rails?
4 paź '25 19:06

Czym jest Row Security w PostgreSQL i po co jest to deweloperom Rails?

Pessimistic Lock w Rails: co to jest i kiedy stosować. Jakie są alternatywy?
31 mar '25 17:45

Pessimistic Lock w Rails: co to jest i kiedy stosować. Jakie są alternatywy?

[Codecov] Jaka jest różnica między pokryciem patch a pokryciem projektu?
9 kwi '25 16:03

[Codecov] Jaka jest różnica między pokryciem patch a pokryciem projektu?

Programowanie wbudowane: co to jest i od czego zacząć
24 mar '25 16:48

Programowanie wbudowane: co to jest i od czego zacząć

Jak kursy Scratch pomagają dzieciom rozwijać umiejętności miękkie?
11 kwi '25 18:24

Jak kursy Scratch pomagają dzieciom rozwijać umiejętności miękkie?

Co to jest XOR i jak to działa?
21 mar '25 17:05

Co to jest XOR i jak to działa?

Co to jest CFB (Cipher Feedback)?
21 mar '25 16:53

Co to jest CFB (Cipher Feedback)?

Czym jest debounce w JavaScript i dlaczego jest to ważne?
21 mar '25 16:39

Czym jest debounce w JavaScript i dlaczego jest to ważne?

24 kwi '25 20:17

Naprawiamy minikube "Próbujesz uruchomić binarkę amd64 na systemie M1."

24 kwi '25 20:55

Instalujemy minikube na Macu z M1 (rezygnujemy z qemu, uruchamiamy na dockerze)

Gdzie znaleźć starszą wersję Google Chrome i ją pobrać? Na przykładzie starego Maca
25 kwi '25 23:02

Gdzie znaleźć starszą wersję Google Chrome i ją pobrać? Na przykładzie starego Maca

9 maj '25 19:27

[FIXED] nie można załadować takiego pliku -- html/pipeline (LoadError) występuje podczas rails generate thredded:install

Czym jest memoizacja (przykłady Ruby i Ruby on Rails)?
20 lut '25 18:16

Czym jest memoizacja (przykłady Ruby i Ruby on Rails)?