设置密钥否定时的MariaDB AUTO_INCREMENT行为

时间:2018-09-17 13:38:36

标签: mariadb

这是与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

1 个答案:

答案 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处'(trytest_autoinc中的BIGINT UNSIGNED值超出范围。{{1 }} *-(1))'“