当自动递增字段达到最大值时,使用重复的密钥更新插入并失败,没有错误

时间:2019-04-07 11:58:01

标签: 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 个答案:

答案 0 :(得分:0)

这符合预期。

考虑:

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:密钥“ PRIMARY”的条目“ 255”重复

基本上就是您所期望的。

现在,如果将ON DUPLICATE KEY UPDATE添加到最后一个INSERT语句中,则不会产生错误,并且表内容现在为:

| ID  | NAME | DESC |
| --- | ---- | ---- |
| 255 | a    | bbbb |

Demo on MySQL 5.6 DB Fiddle (您可以注释ON DUPLICATE KEY子句以生成错误)。

NB:DESC是MySQL中的保留字(在大多数其他RDBMS中,因此必须用反引号括起来)。