#mysql #sql
#mysql #sql
Вопрос:
Смотрите следующий пример:
CREATE TABLE autoincrement_test (
ID tinyint(2) unsigned NOT NULL AUTO_INCREMENT,
NAME varchar(128) COLLATE utf8_unicode_ci NOT NULL,
DESCRIPTION varchar(128) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (ID),
UNIQUE KEY UNIQUE_KEY (NAME)
) ENGINE=InnoDB AUTO_INCREMENT=255 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
ALTER TABLE autoincrement_test AUTO_INCREMENT = 255;
INSERT INTO autoincrement_test (NAME, DESCRIPTION) VALUES ('a', 'aaaa') ;
INSERT INTO autoincrement_test (NAME, DESCRIPTION) VALUES ('b', 'bbbb') , ('c', 'cccc') ON DUPLICATE KEY UPDATE DESCRIPTION = VALUES(DESCRIPTION);
Последнее утверждение должно завершаться ошибкой, поскольку поле автоматического увеличения достигло максимального значения, но это не так.
Если я удалю on duplicate
часть, это завершится неудачей.
Использование mysql 5.6.40
Комментарии:
1. «Последнее утверждение должно завершиться ошибкой, поскольку поле автоматического увеличения достигло максимального значения, но это не так». я думаю
INSERT INTO autoincrement_test (NAME, DESC) VALUES ('b', 'bbbb') , ('c', 'cccc') ON DUPLICATE KEY UPDATE
, чтоDESC = VALUES(DESC);` в этом случае обновляет существующие данные, которые не требуютAUTO_INCREMENT
повторного использования.. Но трудно знать наверняка, не зная данных в таблицах.2. Чтобы подтвердить мой комментарий, вы можете опубликовать полный пользовательский пример (включая другие 255 вставок) на db-fiddle .. Если вы подключаетесь к клиенту (например, к mysql cmd client), который способен создавать таблицу ascii из данных .. db-fiddle может анализировать этот формат в
INSERT
запросах. смотрите синюю кнопку «текст в DDL» в левом углу ниже.3. Нет необходимости вставлять другие записи, совершенно нормально, что таблица будет включать единственную запись с автоидентификацией, которая достигла максимального значения (представьте, что мы удаляем все остальные записи), просто попробуйте этот пример кода
4. Небольшое примечание При создании таблицы происходит сбой, потому что
DESC
это зарезервированное слово. Вам пришлось бы обернуть это слово обратными метками, чтобы оно заработало5. И все остальные команды завершаются неудачей по той же причине
Ответ №1:
Это ведет себя так, как ожидалось.
Рассмотрим:
CREATE TABLE autoincrement_test (
ID tinyint(1) unsigned NOT NULL AUTO_INCREMENT,
NAME varchar(128) COLLATE utf8_unicode_ci NOT NULL,
`DESC` varchar(128) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (ID),
UNIQUE KEY UNIQUE_KEY (NAME)
) ENGINE=InnoDB AUTO_INCREMENT=255 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
ALTER TABLE autoincrement_test auto_increment = 255;
INSERT INTO autoincrement_test (NAME, `DESC`) VALUES ('a', 'aaaa');
INSERT INTO autoincrement_test (NAME, `DESC`) VALUES ('b', 'bbbb');
Это генерирует следующую ошибку:
ER_DUP_ENTRY: дублирующая запись ‘255’ для ключа ‘PRIMARY’
В принципе, это то, что вы ожидаете.
Теперь, если вы добавляете ON DUPLICATE KEY UPDATE
к последнему INSERT
оператору, ошибка не генерируется, и содержимое таблицы теперь:
| ID | NAME | DESC |
| --- | ---- | ---- |
| 255 | a | bbbb |
Демонстрация на MySQL 5.6 DB Fiddle (вы можете прокомментировать ON DUPLICATE KEY
предложение, чтобы сгенерировать ошибку).
ПРИМЕЧАНИЕ: DESC
это зарезервированное слово в MySQL (и в большинстве других СУБД, следовательно, его необходимо окружить обратными метками).
Комментарии:
1. Спасибо GMB за подробный ответ, таким образом, вы согласны, что в случае, если я использую «обновление дубликата ключа», я рискую, что автоматическое увеличение достигнет своего максимального значения, и оно вернет успех, даже если на самом деле этого не произошло. Это известная ошибка в mysql?