ГоловнаВсі публікаціїКатегоріїПро проєкт

Чому PostgreSQL пропускає ID при збережені нових записів? (Heroku)

Обкладинка нотатки: Чому PostgreSQL пропускає ID при збережені нових записів? (Heroku)
Перевіряєте останній ID в базі, а він неочікувано більший ніж реальна кількість записів. Чому таке стається?
У Heroku (та загалом у PostgreSQL) значення ID можуть бути непослідовними через кілька причин:

Автоінкрементне поле (serial / bigserial) та транзакції

  • У Rails ID зазвичай є serial або bigserial, що використовує SEQUENCE для генерації унікальних значень.
  • Якщо транзакція, в якій було виділено ID, скасовується (ROLLBACK), це значення вже не використовується, але SEQUENCE інкрементується далі. Наприклад, якщо створили об'єкт з id = 4, а потім скасували транзакцію, наступний запис отримає id = 5, а 4 залишиться пропущеним.

Паралельні запити

  • У хмарних середовищах, таких як Heroku, може бути багато конкурентних процесів, які записують у базу одночасно.
  • Якщо два запити одночасно створюють нові записи, вони можуть отримати ID у різних порядках.

Перезапуск Dyno (Heroku) та кешування SEQUENCE

  • PostgreSQL кешує значення SEQUENCE, що допомагає підвищити продуктивність.
  • Якщо Dyno (сервер Heroku) перезапуститься, кешовані значення можуть бути втрачені, і PostgreSQL перескочить кілька ID.

Видалені записи

  • Якщо ви видаляєте записи з таблиці (DELETE), їхні ID не перевикористовуються.
  • Наприклад, якщо були записи ID = 1, 2, 3, потім ви видалили 2, наступний ID все одно буде 4.

Як перевірити SEQUENCE?

Виконайте в консолі PostgreSQL:
SELECT last_value, is_called FROM your_table_id_seq;
Або вручну скиньте значення:
SELECT setval('your_table_id_seq', (SELECT MAX(id) FROM your_table));
Це вирівняє SEQUENCE, але не заповнить прогалини у вже створених ID. Це нормальна поведінка PostgreSQL. Якщо вам критично потрібні послідовні ID, можна використовувати ROW_NUMBER(), але для основного ID це не рекомендується.
Що таке Memoization (приклади Ruby та Ruby on Rails)?
20.02.2025 18:16

Що таке Memoization (приклади Ruby та Ruby on Rails)?

meme code
meme code@memecode
Що таке debounce у JavaScript і чому це важливо?
21.03.2025 16:39

Що таке debounce у JavaScript і чому це важливо?

meme code
meme code@memecode
Що таке CFB (Cipher Feedback)?
21.03.2025 16:53

Що таке CFB (Cipher Feedback)?

meme code
meme code@memecode
Що таке XOR і як він працює?
21.03.2025 17:05

Що таке XOR і як він працює?

meme code
meme code@memecode
Embed програмування: що це таке і з чого почати
24.03.2025 16:48

Embed програмування: що це таке і з чого почати

meme code
meme code@memecode
Pessimistic Lock у Rails: що це таке і коли застосовувати. Які є альтернативи?
31.03.2025 17:45

Pessimistic Lock у Rails: що це таке і коли застосовувати. Які є альтернативи?

meme code
meme code@memecode
[Codecov] В чому різниця між patch та project coverage?
09.04.2025 16:03

[Codecov] В чому різниця між patch та project coverage?

meme code
meme code@memecode
Як курси Scratch допомагають дітям розвивати soft skills?
11.04.2025 18:24

Як курси Scratch допомагають дітям розвивати soft skills?

meme code
meme code@memecode
24.04.2025 20:17

Фіксимо minikube "You are trying to run the amd64 binary on an M1 system."

meme code
meme code@memecode
24.04.2025 20:55

Фіксимо minikube на Mac з М1 (відмовляємось від qemu, запускаємо на docker)

meme code
meme code@memecode
Де знайти старішу версію Google Chrome та скачати її? На прикладі старого Mac
25.04.2025 23:02

Де знайти старішу версію Google Chrome та скачати її? На прикладі старого Mac

meme code
meme code@memecode
09.05.2025 19:27

[FIXED] cannot load such file -- html/pipeline (LoadError) виникає під час rails generate thredded:install

meme code
meme code@memecode