请参见以下示例:
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
答案 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中,因此必须用反引号括起来)。