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.

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

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)?

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?

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

Co to jest CFB (Cipher Feedback)?

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

Co to jest XOR i jak to działa?

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

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

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?

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?

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