Что делает атрибут AUTO_INCREMENT в SQL?

«Что делает атрибут AUTO_INCREMENT в SQL?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

AUTO_INCREMENT (или его аналоги) — это атрибут столбца в SQL, который инструктирует СУБД автоматически генерировать уникальные, последовательно возрастающие значения при каждой вставке новой строки. Он используется преимущественно для суррогатных первичных ключей.

Пример создания таблицы в MySQL:

CREATE TABLE users (
    id INT NOT NULL AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100),
    PRIMARY KEY (id)
);
-- При вставке указывать id не нужно
INSERT INTO users (username, email) VALUES ('john_doe', 'john@example.com');

Аналоги в других СУБД:

  • PostgreSQL: Использует тип SERIAL или BIGSERIAL.
    CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT);
  • SQLite: Ключевое слово AUTOINCREMENT (рекомендуется не использовать без необходимости, чтобы не расходовать лишние ресурсы).
  • Oracle: Использует SEQUENCE и TRIGGER, либо GENERATED AS IDENTITY (в современных версиях).
    CREATE SEQUENCE user_seq START WITH 1;
    CREATE TABLE users (
        id NUMBER DEFAULT user_seq.NEXTVAL PRIMARY KEY,
        name VARCHAR2(50)
    );

Важные особенности:

  1. Пропуски значений: Пропуски могут возникать при откате транзакции, удалении строк или сбое сервера. Это нормально, и цель AUTO_INCREMENT — обеспечить уникальность, а не непрерывность.
  2. Безопасность в многопоточной среде: Механизм гарантирует, что две одновременные вставки получат разные значения.
  3. Сброс/изменение: Начальное значение и шаг можно изменить.
    ALTER TABLE users AUTO_INCREMENT = 1000;
  4. Получение последнего вставленного ID:
    -- В MySQL
    SELECT LAST_INSERT_ID();
    -- В PostgreSQL, используя RETURNING
    INSERT INTO users (name) VALUES ('Alice') RETURNING id;