В чем смысл AUTO_INCREMENT?

Я изучаю SQL, используя MySQL, и, возможно, я еще не знаю определенного синтаксиса, но мне просто интересно, какой смысл иметь AUTO_INCREMENT в столбце, если всякий раз, когда я вставляю новую запись в таблицу, мне нужно указывать все остальные столбцы, которые я я вставляю каждый раз, кроме того, который я автоматически увеличиваю, например, для первого столбца установлено автоматическое увеличение, теперь я хочу вставить запись: INSERT INTO table(col2, col3, col4, col5...) VALUES(value2, value3, value4, value5...); Зачем мне это делать, если я могу просто не указывать столбцы и самостоятельно увеличивать значение? Зачем использовать AUTO_INCREMENT в такой ситуации? Например INSERT INTO table VALUES(incremented_value, value2, value3...) Спасибо.

Например, INSERT INTO table VALUES(incremented_value, value2, value3...) Стандарт предлагает присвоить NULL в таком случае - для столбца AI это означает «генерировать следующее значение». т.е. INSERT INTO table VALUES(NULL, value2, value3...).

Akina 23.12.2020 14:32

@Акина хорошо, спасибо, теперь я понимаю.

user14308645 23.12.2020 15:16
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
2
642
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Во-первых, важно понимать, что целочисленный столбец, идентифицирующий каждую строку, очень полезен. Они используются для ограничений внешнего ключа и для упрощения идентификации строки (например, попробуйте запомнить UUID).

Итак, ваш вопрос: «Почему автоматическое увеличение»? Причина проста. Если вы можете сделать так, чтобы база данных обеспечивала достоверность данных, то у вас есть много преимуществ. Наиболее важным преимуществом являются условия гонки — несколько потоков, которые вставляются в таблицу одновременно.

Поскольку база данных гарантирует, что значения уникальны и возрастают, вам — пользователю базы данных — не нужно беспокоиться о дубликатах. Люди, которые написали базу данных, уже сделали это за вас.

Это вопиюще неверно в том, как разрозненные идеи смешиваются в одну. Автоинкремент (или последовательности, или что-то еще) не имеют ничего общего с достоверностью данных, это инструменты QoL для простых случаев. Уникальность столбца проверяется отдельной независимой процедурой. Автоинкременты также не дают гарантий, клиентский ввод всегда имеет приоритет.

Slotos 19.10.2022 10:43

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

Поэтому ясно, что когда вы вставляете следующую строку в такую ​​таблицу, вы хотите убедиться, что целочисленное значение, которое вы используете для первичного ключа, уже не существует в таблице. Таким образом, столбец первичного ключа AUTO_INCREMENT избавляет вас от бремени отслеживания уже использованных значений.

Теперь вам может понадобиться узнать фактическое значение, которое использовалось в качестве первичного ключа для этой последней вставки, поскольку оно может понадобиться для последующей вставки в связанную таблицу, где это значение ключа является внешним ключом. Получение значения столбца, который использует AUTO_INCREMENT после оператора INSERT, может быть достигнуто, если вы выполните следующий запрос сразу после INSERT:

SELECT LAST_ID();

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

INSERT INTO some_other_table(primary_key, foreign_key) VALUES('primary-key-value', LAST_ID());

Другие вопросы по теме