这是与AUTO_INCREMENT
行为有关的MariaDB相关问题,我目前无法确定。 MariaDB版本:10.2.16。
给出下表:
CREATE TABLE `test_autoinc` (
`myid` BIGINT(255) NOT NULL AUTO_INCREMENT,
`myval` VARCHAR(16) NOT NULL,
PRIMARY KEY (`myid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
要测试AUTO_INCREMENT
:
SHOW TABLE STATUS
FROM `myDB`
WHERE `name` LIKE 'test_autoinc' ;
/* => AUTO_INCREMENT= 1 */
现在添加一些数据:
INSERT INTO `test_autoinc` (`myval`) VALUES ('a'), ('b'), ('c');
/* => AUTO_INCREMENT = 31 (offset 10 has been configured... all fine) */
如果我现在执行此更新...
UPDATE `test_autoinc`
SET `myid` = `myid` * (-1)
WHERE `myval` = 'a';
...我现在有AUTO_INCREMENT
的{{1}}!
经过一番挖掘,我发现了why this happens:
一段时间以来,我一直使用具有相应机制的这张表,但从未真正发现任何与此相关的问题。它嵌套在旧应用程序的深层中,我目前正在将其迁移到另一台数据库服务器上,因此更改此选项并不是真正的选择。
每个表只能有一个AUTO_INCREMENT列,它必须是 索引,并且不能具有DEFAULT值。 AUTO_INCREMENT列 仅当它只包含正值时,它才能正常工作。 插入一个 负数被视为插入了很大的正数。 这样做是为了避免从数字换行时出现精度问题。 从正面到负面,并确保您不会意外 得到一个包含0的AUTO_INCREMENT列。
18446744073709551615
相关参数:
AUTO_INCREMENT
非常感谢大家。
如何在不更改此机制的情况下适应这种行为?我希望SHOW VARIABLES LIKE "%incre%";
auto_increment_increment 10
auto_increment_offset 1
div_precision_increment 4
innodb_autoextend_increment 64
wsrep_auto_increment_control ON
中有AUTO_INCREMENT
。
答案 0 :(得分:0)
根据错误AUTO_INCREMENT breaks after updating a column value to a negative number,您的问题已在10.2.16和10.3.8中修复。如果您可以在10.2.16中进行演示,建议您尝试重新打开该错误报告。
与此同时,一些随机评论:
最好将AUTO_INCREMENT
列保留为空。
否定(如SET
myid = myid * (-1)
)未签名的数量是什么意思?垃圾。
18446744073709551615(以十六进制表示)是ffffffffffffffff,并且是BIGINT UNSIGNED
的最大值。但是十六进制表示的是BIGINT UNSIGNED
中-1的表示形式。
此
auto_increment_increment 10
auto_increment_offset 1
声明该值为1、11、21、31、41,...,而不是通常的1,2,3,4,5,...
有些相关:_Bug: last_insert(id) does not support bigint unsigned_
当我在5.6.22上进行测试时:
BIGINT SIGNED
-myid
的'a'是-1
。BIGINT UNSIGNED
-用{ERROR 1690(22003)开头的UPDATE
处'(try
。test_autoinc
中的BIGINT UNSIGNED值超出范围。{{1 }} *-(1))'“