Вставка с дублированием ключа при обновлении завершается неудачно, когда поле автоматического приращения достигло максимального значения - PullRequest
0 голосов
/ 07 апреля 2019

См. Следующий пример:

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 Ответ

0 голосов
/ 07 апреля 2019

Это ведет себя как ожидалось.

Рассмотрим:

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 Fiddle DB (вы можете прокомментировать предложение ON DUPLICATE KEY для генерации ошибки).

NB: DESC является зарезервированным словом в MySQL (и в большинстве других RDBMS, следовательно, оно должно быть заключено в обратные галочки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...