0 0

mysql自增长为什么会每次加 2 ??5

小弟在一个数据表里用到自增长作为id,开始10个数据是好,每次增1,但是从11开始,每次增长变成了2。即在数据库表里是这样的:
id
1
2
3
...
8
9
10
11
13
15
17
19
十分诡异,开始以为是我jdbc代码问题,后来发现不是,我用insert语句手动插入一条数据也是得到奇数的 id !!
用desc看表结构,该字段是int not null primary key auto_increment,也看不出什么不对的地方。
不知哪位高人也遇到过此类问题,不吝赐教。

(后来发现另一张用到自增长id的表也是1、2、3、4、5、6、7、8、9、11、13、15、17、19……只是没出现10,其它都一样;
肯定是有问题,就是找不出来,在搜索引擎里搜索都不知道打什么关键字……)

问题补充:
pjw0221 写道
你肯定删过某一条, 在14的时候 肯定被删过,在添加的话 就不是14了,就是15了。

应该没有,我那时都没做删除的功能;即便删除了,怎么解释以后都一直跳跃式增长呢?

问题补充:
Ihavegotyou 写道
show create table tableName; --看看是否是修改表结构了?

是修改过表结构,增加了字段,但是没有修改id这个字段,难道修改别的字段对它也有影响??

问题补充:
Ihavegotyou 写道
show variables like '%increment%';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| auto_increment_increment      | 1     |
| auto_increment_offset         | 1     |
| div_precision_increment       | 4     |
| innodb_autoextend_increment   | 8     |
| ndb_autoincrement_prefetch_sz | 32    |
+-------------------------------+-------+
5 rows in set (0.01 sec)


看看上面两个红色的field的value.

我这里显示如下:
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| auto_increment_increment      | 2    |
| auto_increment_offset         | 1     |
| div_precision_increment       | 4     |
| innodb_autoextend_increment   | 8     |
+-------------------------------+-------+
4 rows in set (0.00 sec)
两个问题:1.这个2怎么改回1啊? 2.我怎么才4行结果,你那个第五行是什么?

问题补充:
Ihavegotyou 写道
如果想永久性的改回为1,在my.cnf or my.ini中查找这个field,然后修改,然后restart mysql.
如果只想在当前测试一下当前的Session(在Console下的一个连接),可以直接修改
set auto_increment_increment = 1


还是不行,用了set auto_increment_increment = 1和set @@auto_increment_increment = 1
都提示成功。但是插入时还是老样子,id是跳着增长的。
重启了一下mysql服务也是如此。
(my.cnf或者my.ini没改,怕影响到别人)

问题补充:
Ihavegotyou 写道
用了set auto_increment_increment = 1,然后,你在mysql的mysql>
insert into table table name values.....

可能这里第一次没有成功,
多执行几次insert,就看到效果了。


果然在命令行里敲insert是正常了,但是在程序里(jdbc)和工具里(Mysql Query Browser)插入还是老样子,每次增2,关了重开也没用。用的同样的insert语句,为什么在mysql> 下insert就好,程序插入就出问题了呢?

问题补充:
Ihavegotyou 写道
既然你熟悉jdbc,就应该知道Connection.  在Console里面设置,是只对该Connection有用。
同样,你也可以用相关的statement执行:   set auto_increment_increment = 1, 然后在同一个事务中执行其他的语句.

也不是很熟,就会增删改查,高级一点的就不会了,你的意思是我懂了,试了一下可行,但是必须每次插入操作前都执行一遍set auto_increment_increment = 1,有别的好方法吗?
2010年3月22日 09:54

10个答案 按时间排序 按投票排序

0 0

采纳的答案

try:
set @@global.auto_increment_increment = 1;
set @@auto_increment_increment =1;

2010年3月22日 16:48
0 0

既然你熟悉jdbc,就应该知道Connection.  在Console里面设置,是只对该Connection有用。
同样,你也可以用相关的statement执行:   set auto_increment_increment = 1, 然后在同一个事务中执行其他的语句.

2010年3月22日 14:53
0 0

用了set auto_increment_increment = 1,然后,你在mysql的mysql>
insert into table table name values.....

可能这里第一次没有成功,
多执行几次insert,就看到效果了。

2010年3月22日 13:53
0 0

在使用AUTO_INCREMENT时,需要注意这个问题:
mysql表的种类不同,使用也不同。

引用
对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。

2010年3月22日 13:13
0 0

补充:mysql技术还是在发展中,免不了存在bug。

关于Replication and AUTO_INCREMENT ,AUTO_INCREMENT的bug参考如下:

http://dev.mysql.com/doc/refman/5.0/en/replication-features-auto-increment.html

2010年3月22日 13:09
0 0

设置方法:

SET @@auto_increment_increment=1;


关于auto_increment_increment,auto_increment_offset 的详细说明和具体的例子可以参考mysql的document.
http://dev.mysql.com/doc/refman/5.0/en/replication-options-master.html#sysvar_auto_increment_increment
另外第五行的那个属性是说明insert的快慢。

E文如下说:
引用
•ndb_autoincrement_prefetch_sz
mysql Version Introduced 4.1.8

Determines the probability of gaps in an autoincremented column. Set it to 1 to minimize this. Setting it to a high value for optimization — makes inserts faster, but decreases the likelihood that consecutive autoincrement numbers will be used in a batch of inserts. Default value: 32. Minimum value: 1.

2010年3月22日 13:07
0 0

如果想永久性的改回为1,在my.cnf or my.ini中查找这个field,然后修改,然后restart mysql.
如果只想在当前测试一下当前的Session(在Console下的一个连接),可以直接修改
set auto_increment_increment = 1

2010年3月22日 12:59
0 0

show variables like '%increment%';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| auto_increment_increment      | 1     |
| auto_increment_offset         | 1     |
| div_precision_increment       | 4     |
| innodb_autoextend_increment   | 8     |
| ndb_autoincrement_prefetch_sz | 32    |
+-------------------------------+-------+
5 rows in set (0.01 sec)


看看上面两个红色的field的value.

2010年3月22日 11:06
0 0

show create table tableName; --看看是否是修改表结构了?

2010年3月22日 10:18
0 0

你肯定删过某一条, 在14的时候 肯定被删过,在添加的话 就不是14了,就是15了。

2010年3月22日 09:56

相关推荐

    mysql实现char类型主键自增长

    在MySQL数据库管理中,自增长主键是一种常见的设计模式,主要用于自动为每一行记录生成一个唯一的标识符。然而,这种自增长通常与整型数据类型(如INT)关联,而较少见于字符型数据(如CHAR)。本文将深入探讨如何在...

    MySQL自增长键理解

    `auto_increment_increment`变量定义了自增长的步长,默认值为1,这意味着每次自增长时数值增加1。而`auto_increment_offset`则设置了初始值,也就是自增长序列的第一个值,默认也是1。 当试图插入一个值X到具有自...

    mysql取得自动增长的主键值

    在MySQL数据库中,自动增长字段是一种非常有用的特性,尤其是在需要为主键分配唯一标识符的情况下。通过设置一个列的`AUTO_INCREMENT`属性,每当向表中插入新记录时,该列的值会自动递增。这种方式极大地简化了数据...

    OracleID自增长

    因此,为了实现类似MySQL的自增长特性,我们需要借助于Oracle提供的序列(sequence)和触发器(trigger)来实现这一功能。本文将详细介绍如何在Oracle中实现ID自增长,并通过具体的步骤和示例代码来进行演示。 ####...

    Oracle与Mysql自动增长列(id)的区别

    每次插入新行时,MySQL会自动为`id`列分配下一个可用的值。`AUTO_INCREMENT`的初始值可以调整,以满足特定需求。 相比之下,Oracle不支持直接在创建表时设置自动增长列。要实现类似功能,需要先创建一个序列对象,...

    如何为oracle中的表增加自动增长列.pdf

    以下是为Oracle中的表增加自动增长列的几个步骤: 1. 创建一个序列: 序列是Oracle数据库中用于生成一组数字的对象。创建序列的SQL命令通常如下所示: ```sql CREATE SEQUENCE your_sequence_name START WITH 1 ...

    oracle主键自动增长

    在Oracle数据库中,并没有像MySQL那样的自动增长字段特性,因此在实际应用中,我们常常需要手动实现这一功能。序列(Sequence)是Oracle提供的一种用于生成一系列唯一数值的对象,非常适合用来作为表中的主键值。 #...

    改DB的结构(由非自动增长改为自动增长)

    在数据库管理中,数据表的主键通常设计为自动增长型,以便于系统自动为新插入的记录生成唯一的标识符。然而,在某些情况下,数据库表的结构可能最初被设计为非自动增长,导致在后期使用中需要进行修改。本文将探讨...

    设置MySQL自动增长从某个指定的数开始方法

    在MySQL数据库中,自动增长(AUTO_INCREMENT)是一个非常实用的功能,它允许你在插入新记录时自动为某个字段分配唯一的递增值。这个功能通常用于主键字段,确保每条记录的唯一标识。以下是对如何设置MySQL自动增长...

    MySQL rownumber SQL生成自增长序号使用介绍

    在MySQL中,生成自增长序号是常见的需求,尤其是在处理数据分页或排序时。然而,与Oracle和SQL Server等其他数据库系统不同,MySQL的早期版本(如5.1.33)并未提供ROWNUM这样的内置功能。这篇文章将介绍如何在MySQL...

    深入Mysql,SqlServer,Oracle主键自动增长的设置详解

    当你创建一个表并定义某个字段为`auto_increment`类型的主键时,如`id int auto_increment primary key not null`,每次插入新记录且不提供该字段的值时,MySQL会自动为该字段分配下一个递增的整数值。例如在创建`...

    mysql高可用+mysql双主

    * auto-increment-increment=2:表示自增长字段每次递增的量 * auto-increment-offset=1:用来设定数据库中自动增长的起点 2. 授权账户 在mysql1主机上,我们需要创建授权账户,允许在mysql2主机上连接: grant ...

    mysql把主键定义为自动增长标识符类型

    - 当使用自动增长的主键时,插入数据时可以忽略该字段,MySQL会自动为其生成一个新的值。例如: ```sql INSERT INTO customers (name) VALUES ("name1"), ("name2"); ``` - 在这个例子中,我们仅指定了`name`...

    oracle自增长与临时表

    在Oracle中,没有像其他数据库系统(如MySQL)那样内置的自增长机制。但是,我们可以通过创建序列(Sequences)来实现类似的功能。序列是一种数据库对象,可以生成一系列的唯一数值,常用于主键字段。 1. **创建...

    建立oracle带自增长表

    首先,我们需要了解Oracle中的自增长特性是通过序列(Sequences)来实现的,而不是像其他数据库系统(如SQL Server或MySQL)那样直接在表定义中指定。序列是一种数据库对象,它能够按照预设的步长(increment by)...

    SQL Server 打开或关闭自增长

    在SQL Server中,自增长(IDENTITY)列是一种特殊类型的字段,它会在每次插入新行时自动为该列提供一个唯一的、递增的值。这种功能对于创建序列化的主键非常有用,因为它们确保了数据的唯一性。然而,有时在特定情况...

Global site tag (gtag.js) - Google Analytics