-
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个答案 按时间排序 按投票排序
-
采纳的答案
try:
set @@global.auto_increment_increment = 1;
set @@auto_increment_increment =1;2010年3月22日 16:48
-
既然你熟悉jdbc,就应该知道Connection. 在Console里面设置,是只对该Connection有用。
同样,你也可以用相关的statement执行: set auto_increment_increment = 1, 然后在同一个事务中执行其他的语句.2010年3月22日 14:53
-
用了set auto_increment_increment = 1,然后,你在mysql的mysql>
insert into table table name values.....
可能这里第一次没有成功,
多执行几次insert,就看到效果了。2010年3月22日 13:53
-
在使用AUTO_INCREMENT时,需要注意这个问题:
mysql表的种类不同,使用也不同。引用对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。2010年3月22日 13:13
-
补充:mysql技术还是在发展中,免不了存在bug。
关于Replication and AUTO_INCREMENT ,AUTO_INCREMENT的bug参考如下:
http://dev.mysql.com/doc/refman/5.0/en/replication-features-auto-increment.html2010年3月22日 13:09
-
设置方法:
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
-
如果想永久性的改回为1,在my.cnf or my.ini中查找这个field,然后修改,然后restart mysql.
如果只想在当前测试一下当前的Session(在Console下的一个连接),可以直接修改
set auto_increment_increment = 12010年3月22日 12:59
-
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
相关推荐
在MySQL数据库管理中,自增长主键是一种常见的设计模式,主要用于自动为每一行记录生成一个唯一的标识符。然而,这种自增长通常与整型数据类型(如INT)关联,而较少见于字符型数据(如CHAR)。本文将深入探讨如何在...
`auto_increment_increment`变量定义了自增长的步长,默认值为1,这意味着每次自增长时数值增加1。而`auto_increment_offset`则设置了初始值,也就是自增长序列的第一个值,默认也是1。 当试图插入一个值X到具有自...
在MySQL数据库中,自动增长字段是一种非常有用的特性,尤其是在需要为主键分配唯一标识符的情况下。通过设置一个列的`AUTO_INCREMENT`属性,每当向表中插入新记录时,该列的值会自动递增。这种方式极大地简化了数据...
因此,为了实现类似MySQL的自增长特性,我们需要借助于Oracle提供的序列(sequence)和触发器(trigger)来实现这一功能。本文将详细介绍如何在Oracle中实现ID自增长,并通过具体的步骤和示例代码来进行演示。 ####...
每次插入新行时,MySQL会自动为`id`列分配下一个可用的值。`AUTO_INCREMENT`的初始值可以调整,以满足特定需求。 相比之下,Oracle不支持直接在创建表时设置自动增长列。要实现类似功能,需要先创建一个序列对象,...
以下是为Oracle中的表增加自动增长列的几个步骤: 1. 创建一个序列: 序列是Oracle数据库中用于生成一组数字的对象。创建序列的SQL命令通常如下所示: ```sql CREATE SEQUENCE your_sequence_name START WITH 1 ...
在Oracle数据库中,并没有像MySQL那样的自动增长字段特性,因此在实际应用中,我们常常需要手动实现这一功能。序列(Sequence)是Oracle提供的一种用于生成一系列唯一数值的对象,非常适合用来作为表中的主键值。 #...
在数据库管理中,数据表的主键通常设计为自动增长型,以便于系统自动为新插入的记录生成唯一的标识符。然而,在某些情况下,数据库表的结构可能最初被设计为非自动增长,导致在后期使用中需要进行修改。本文将探讨...
在MySQL数据库中,自动增长(AUTO_INCREMENT)是一个非常实用的功能,它允许你在插入新记录时自动为某个字段分配唯一的递增值。这个功能通常用于主键字段,确保每条记录的唯一标识。以下是对如何设置MySQL自动增长...
在MySQL中,生成自增长序号是常见的需求,尤其是在处理数据分页或排序时。然而,与Oracle和SQL Server等其他数据库系统不同,MySQL的早期版本(如5.1.33)并未提供ROWNUM这样的内置功能。这篇文章将介绍如何在MySQL...
当你创建一个表并定义某个字段为`auto_increment`类型的主键时,如`id int auto_increment primary key not null`,每次插入新记录且不提供该字段的值时,MySQL会自动为该字段分配下一个递增的整数值。例如在创建`...
* auto-increment-increment=2:表示自增长字段每次递增的量 * auto-increment-offset=1:用来设定数据库中自动增长的起点 2. 授权账户 在mysql1主机上,我们需要创建授权账户,允许在mysql2主机上连接: grant ...
- 当使用自动增长的主键时,插入数据时可以忽略该字段,MySQL会自动为其生成一个新的值。例如: ```sql INSERT INTO customers (name) VALUES ("name1"), ("name2"); ``` - 在这个例子中,我们仅指定了`name`...
在Oracle中,没有像其他数据库系统(如MySQL)那样内置的自增长机制。但是,我们可以通过创建序列(Sequences)来实现类似的功能。序列是一种数据库对象,可以生成一系列的唯一数值,常用于主键字段。 1. **创建...
首先,我们需要了解Oracle中的自增长特性是通过序列(Sequences)来实现的,而不是像其他数据库系统(如SQL Server或MySQL)那样直接在表定义中指定。序列是一种数据库对象,它能够按照预设的步长(increment by)...
在SQL Server中,自增长(IDENTITY)列是一种特殊类型的字段,它会在每次插入新行时自动为该列提供一个唯一的、递增的值。这种功能对于创建序列化的主键非常有用,因为它们确保了数据的唯一性。然而,有时在特定情况...