BIGINT — восьмибайтовый целочисленный тип, а SERIAL — сокращение для целочисленного столбца с последовательностью и значением по умолчанию. SERIAL обычно создаёт INTEGER, BIGSERIAL — BIGINT. Большая ёмкость и автогенерация не исключают друг друга: можно использовать BIGINT GENERATED ... AS IDENTITY. Уникальность задаётся отдельным ограничением.
Почему для ID выбирают BIGINT и чем он отличается от SERIAL в PostgreSQL?
Размер целого числа и автоматическая генерация — разные свойства. BIGSERIAL, identity-столбцы, последовательности и пропуски идентификаторов.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
В вопросе сравниваются разные характеристики: тип хранения и механизм генерации. BIGINT хранит знаковое 64-битное число, но сам по себе не генерирует значения. У INTEGER меньший диапазон; выбор зависит от ожидаемого срока жизни данных, скорости расходования ID и требований интеграций.
SERIAL — не самостоятельный настоящий тип. Это удобная запись, создающая целочисленный столбец, последовательность и значение по умолчанию из неё. SERIAL соответствует INTEGER, BIGSERIAL — BIGINT; см. документацию PostgreSQL.
В новом DDL можно явно разделить свойства:
CREATE TABLE users (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
name TEXT NOT NULL
);
BY DEFAULT допускает явную передачу значения при вставке; ALWAYS задаёт более строгий режим. Отличия описаны в разделе identity columns.
Ни sequence, ни identity не заменяют PRIMARY KEY или UNIQUE. Возможны пропуски, например после отката транзакции; это не счётчик числа строк и не непрерывная нумерация документов.
BIGINT занимает восемь байт вместо четырёх у INTEGER и может увеличить объём данных и индексов; эффект зависит от схемы, выравнивания и структуры индекса. Его выбирают осознанно, учитывая, что поздняя миграция многочисленных внешних ключей тоже может оказаться дорогой. BIGINT не решает автоматически генерацию уникальных ID между независимыми базами.