При добавлении новой записи с уникальными индексами выбор такого уникального значения может оказаться непростой задачей. Решением может быть дополнительный запрос, направленный на выявление максимального значения первичного ключа для генерации нового уникального значения.
И приводится пример кода:
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;
В статье говорится:
И приводится пример кода:
Но ведь это не нахождение максимального значения, а подсчет строк? Создайте 5 строк с данными и удалите все, кроме, например, 3 и 5. Выполнение INSERT с подобным кодом приведет к коллизии, так как COUNT(*) + 1 вернет 3, а запись с таким ID уже есть.
Я так понимаю, что основной задачей было показать как сделать выборку из той же таблицы, куда делается вставка, но быть может стоит все же предупредить о такой проблеме и показать подзапрос для действительного нахождения максимального значения первичного ключа, например, такого плана:
Или:
Или: