Я изучаю 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...)
Спасибо.
@Акина хорошо, спасибо, теперь я понимаю.
Во-первых, важно понимать, что целочисленный столбец, идентифицирующий каждую строку, очень полезен. Они используются для ограничений внешнего ключа и для упрощения идентификации строки (например, попробуйте запомнить UUID).
Итак, ваш вопрос: «Почему автоматическое увеличение»? Причина проста. Если вы можете сделать так, чтобы база данных обеспечивала достоверность данных, то у вас есть много преимуществ. Наиболее важным преимуществом являются условия гонки — несколько потоков, которые вставляются в таблицу одновременно.
Поскольку база данных гарантирует, что значения уникальны и возрастают, вам — пользователю базы данных — не нужно беспокоиться о дубликатах. Люди, которые написали базу данных, уже сделали это за вас.
Это вопиюще неверно в том, как разрозненные идеи смешиваются в одну. Автоинкремент (или последовательности, или что-то еще) не имеют ничего общего с достоверностью данных, это инструменты QoL для простых случаев. Уникальность столбца проверяется отдельной независимой процедурой. Автоинкременты также не дают гарантий, клиентский ввод всегда имеет приоритет.
Вы хотите, чтобы каждая строка имела уникальный первичный ключ, и во многих случаях не требуется никакой семантики, связанной с этим ключом (примером первичного ключа, который имеет семантику, т. е. значение, связанное с ним, будет номер социального страхования человека) . В этих случаях в качестве первичного ключа достаточно простого целого числа.
Поэтому ясно, что когда вы вставляете следующую строку в такую таблицу, вы хотите убедиться, что целочисленное значение, которое вы используете для первичного ключа, уже не существует в таблице. Таким образом, столбец первичного ключа AUTO_INCREMENT избавляет вас от бремени отслеживания уже использованных значений.
Теперь вам может понадобиться узнать фактическое значение, которое использовалось в качестве первичного ключа для этой последней вставки, поскольку оно может понадобиться для последующей вставки в связанную таблицу, где это значение ключа является внешним ключом. Получение значения столбца, который использует AUTO_INCREMENT после оператора INSERT, может быть достигнуто, если вы выполните следующий запрос сразу после INSERT:
SELECT LAST_ID();
Конечно, если причиной получения этого значения является вставка его в другую таблицу в качестве внешнего ключа, то вы можете сделать:
INSERT INTO some_other_table(primary_key, foreign_key) VALUES('primary-key-value', LAST_ID());
Например,
INSERT INTO table VALUES(incremented_value, value2, value3...)
Стандарт предлагает присвоить NULL в таком случае - для столбца AI это означает «генерировать следующее значение». т.е.INSERT INTO table VALUES(NULL, value2, value3...)
.