SQL-Academy / ru.sql-academy

Курс по SQL
https://sql-academy.org/ru/guide
40 stars 21 forks source link

Первичный ключ при добавлении новой записи #26

Closed PrideByte closed 21 hours ago

PrideByte commented 1 month ago

В статье говорится:

При добавлении новой записи с уникальными индексами выбор такого уникального значения может оказаться непростой задачей. Решением может быть дополнительный запрос, направленный на выявление максимального значения первичного ключа для генерации нового уникального значения.

И приводится пример кода:

INSERT INTO Goods SELECT COUNT(*) + 1, 'Table', 2 FROM Goods;

Но ведь это не нахождение максимального значения, а подсчет строк? Создайте 5 строк с данными и удалите все, кроме, например, 3 и 5. Выполнение INSERT с подобным кодом приведет к коллизии, так как COUNT(*) + 1 вернет 3, а запись с таким ID уже есть.

изображение

Я так понимаю, что основной задачей было показать как сделать выборку из той же таблицы, куда делается вставка, но быть может стоит все же предупредить о такой проблеме и показать подзапрос для действительного нахождения максимального значения первичного ключа, например, такого плана:

INSERT INTO Goods
SELECT MAX(good_id) + 1, 'Table', 2 FROM Goods;

Или:

INSERT INTO Goods
SELECT (
    SELECT MAX(good_id)
    FROM Goods
  ) + 1,
  'Table', 2;

Или:

INSERT INTO Goods
SELECT (
    SELECT good_id
    FROM Goods
    ORDER BY good_id DESC
    LIMIT 1
  ) + 1,
  'Table', 2;

изображение

NepeinAV commented 21 hours ago

Извиняюсь за долгий ответ, не заметил этот issue. Спасибо за предложение, переделаем этот абзац