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 18:16

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

meme code
meme code@memecode
Czym jest debounce w JavaScript i dlaczego jest to ważne?
21 mar 16:39

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

meme code
meme code@memecode
Co to jest CFB (Cipher Feedback)?
21 mar 16:53

Co to jest CFB (Cipher Feedback)?

meme code
meme code@memecode
Co to jest XOR i jak to działa?
21 mar 17:05

Co to jest XOR i jak to działa?

meme code
meme code@memecode
Programowanie wbudowane: co to jest i od czego zacząć
24 mar 16:48

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

meme code
meme code@memecode
Pessimistic Lock w Rails: co to jest i kiedy stosować. Jakie są alternatywy?
31 mar 17:45

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

meme code
meme code@memecode
[Codecov] Jaka jest różnica między pokryciem patch a pokryciem projektu?
9 kwi 16:03

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

meme code
meme code@memecode
Jak kursy Scratch pomagają dzieciom rozwijać umiejętności miękkie?
11 kwi 18:24

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

meme code
meme code@memecode
24 kwi 20:17

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

meme code
meme code@memecode
24 kwi 20:55

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

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

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

meme code
meme code@memecode
9 maj 19:27

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

meme code
meme code@memecode