我有一个带有自动增量主键的表,以及一个将 id 设置为 null 的插入,以便使用自动增量。这是我通常做的,是预期的行为并且工作正常。
使用一张表,我发现有时(并非总是)Mariadb 错误主键重复。即使我没有设置一个。但是,如果我再次运行完全相同的查询,它就可以正常工作。
定义的相关部分:
CREATE TABLE `Account` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`created` datetime DEFAULT NULL,
`customer_id` bigint(20) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY (`customer_id`),
FOREIGN KEY (`customer_id`) REFERENCES `Customer` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=2558023 DEFAULT CHARSET=utf8
和插入:
INSERT INTO Account SET
id = NULL, created = '2021-09-27 14:57:28', customer_id = 2558019
抛出错误:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2558021' for key 'PRIMARY'
因此,当我指定 null (应该如此)但后来发现它是重复的(它不应该)时,它似乎试图使用 id 2558021 作为 PK。我可以看到 pk 2558021 在一分钟后为另一个客户插入。
我确实发现表定义上设置的自动增量低于最高 id。我认为这无关紧要,但我已经解决了。但问题还在继续。
我正在使用 mariadb 10.1.35 和 php 7.2。我没有使用交易。
我什至无法弄清楚这是怎么发生的。有什么bug吗?是否有一组奇怪的情况会导致这种情况?