`

关于MySQL的AUTO_INCREMENT(自动递增)的设置

阅读更多
CREATE TABLE test
(
id INT UNSIGNED NOT NULL PrimaRY KEY AUTO_INCREMENT,
username VARCHAR(15) NOT NULL
)
AUTO_INCREMENT = 100;


在数据库应用,我们经常要用到唯一编号,以标识记录。在MySQL中可通过数据列的AUTO_INCREMENT属性来自动生成。MySQL支持多种数据表,每种数据表的自增属性都有差异,这里将介绍各种数据表里的数据列自增属性。

ISAM表

如果把一个NULL插入到一个AUTO_INCREMENT数据列里去,MySQL将自动生成下一个序列编号。编号从1开始,并1为基数递增。

把0插入AUTO_INCREMENT数据列的效果与插入NULL值一样。但不建议这样做,还是以插入NULL值为好。

当插入记录时,没有为AUTO_INCREMENT明确指定值,则等同插入NULL值。

当插入记录时,如果为AUTO_INCREMENT数据列明确指定了一个数值,则会出现两种情况,情况一,如果插入的值与已有的编号重复,则会出现出错信息,因为AUTO_INCREMENT数据列的值必须是唯一的;情况二,如果插入的值大于已编号的值,则会把该插入到数据列中,并使在下一个编号将从这个新值开始递增。也就是说,可以跳过一些编号。

如果自增序列的最大值被删除了,则在插入新记录时,该值被重用。

如果用UPDATE命令更新自增列,如果列值与已有的值重复,则会出错。如果大于已有值,则下一个编号从该值开始递增。

如果用replace命令基于AUTO_INCREMENT数据列里的值来修改数据表里的现有记录,即AUTO_INCREMENT数据列出现在了replace命令的where子句里,相应的AUTO_INCREMENT值将不会发生变化。但如果replace命令是通过其它的PrimaRY KEY OR UNIQUE索引来修改现有记录的(即AUTO_INCREMENT数据列没有出现在replace命令的where子句中),相应的AUTO_INCREMENT值--如果设置其为NULL(如没有对它赋值)的话--就会发生变化。

last_insert_id()函数可获得自增列自动生成的最后一个编号。但该函数只与服务器的本次会话过程中生成的值有关。如果在与服务器的本次会话中尚未生成AUTO_INCREMENT值,则该函数返回0。

其它数据表的自动编号机制都以ISAM表中的机制为基础。

MyISAM数据表

删除最大编号的记录后,该编号不可重用。

可在建表时可用“AUTO_INCREMENT=n”选项来指定一个自增的初始值。

可用alter table table_name AUTO_INCREMENT=n命令来重设自增的起始值。

可使用复合索引在同一个数据表里创建多个相互独立的自增序列,具体做法是这样的:为数据表创建一个由多个数据列组成的PrimaRY KEY OR UNIQUE索引,并把AUTO_INCREMENT数据列包括在这个索引里作为它的最后一个数据列。这样,这个复合索引里,前面的那些数据列每构成一种独一无二的组合,最末尾的AUTO_INCREMENT数据列就会生成一个与该组合相对应的序列编号。

HEAP数据表

HEAP数据表从MySQL4.1开始才允许使用自增列。

自增值可通过CREATE TABLE语句的 AUTO_INCREMENT=n选项来设置。

可通过ALTER TABLE语句的AUTO_INCREMENT=n选项来修改自增始初值。

编号不可重用。

HEAP数据表不支持在一个数据表中使用复合索引来生成多个互不干扰的序列编号。

BDB数据表

不可通过CREATE TABLE OR ALTER TABLE的AUTO_INCREMENT=n选项来改变自增初始值。

可重用编号。

支持在一个数据表里使用复合索引来生成多个互不干扰的序列编号。

InnDB数据表

不可通过CREATE TABLE OR ALTER TABLE的AUTO_INCREMENT=n选项来改变自增初始值。

不可重用编号。

不支持在一个数据表里使用复合索引来生成多个互不干扰的序列编号。

在使用AUTO_INCREMENT时,应注意以下几点:

AUTO_INCREMENT是数据列的一种属性,只适用于整数类型数据列。

设置AUTO_INCREMENT属性的数据列应该是一个正数序列,所以应该把该数据列声明为UNSIGNED,这样序列的编号个可增加一倍。

AUTO_INCREMENT数据列必须有唯一索引,以避免序号重复。

AUTO_INCREMENT数据列必须具备NOT NULL属性。

AUTO_INCREMENT数据列序号的最大值受该列的数据类型约束,如TINYINT数据列的最大编号是127,如加上UNSIGNED,则最大为255。一旦达到上限,AUTO_INCREMENT就会失效。

当进行全表删除时,AUTO_INCREMENT会从1重新开始编号。全表删除的意思是发出以下两条语句时:

delete from table_name;ortruncate table table_name
这是因为进行全表操作时,MySQL实际是做了这样的优化操作:先把数据表里的所有数据和索引删除,然后重建数据表。如果想删除所有的数据行又想保留序列编号信息,可这样用一个带where的delete命令以抑制MySQL的优化:

delete from table_name where 1;
这将迫使MySQL为每个删除的数据行都做一次条件表达式的求值操作。

强制MySQL不复用已经使用过的序列值的方法是:另外创建一个专门用来生成AUTO_INCREMENT序列的数据表,并做到永远不去删除该表的记录。当需要在主数据表里插入一条记录时,先在那个专门生成序号的表中插入一个NULL值以产生一个编号,然后,在往主数据表里插入数据时,利用LAST_INSERT_ID()函数取得这个编号,并把它赋值给主表的存放序列的数据列。如:

insert into id set id = NULL;insert into main set main_id = LAST_INSERT_ID();
可用alter命令给一个数据表增加一个具有AUTO_INCREMENT属性的数据列。MySQL会自动生成所有的编号。

要重新排列现有的序列编号,最简单的方法是先删除该列,再重建该,MySQL会重新生连续的编号序列。

在不用AUTO_INCREMENT的情况下生成序列,可利用带参数的LAST_INSERT_ID()函数。如果用一个带参数的LAST_INSERT_ID(expr)去插入或修改一个数据列,紧接着又调用不带参数的LAST_INSERT_ID()函数,则第二次函数调用返回的就是expr的值。下面演示该方法的具体操作:

先创建一个只有一个数据行的数据表:create table seq_table (id int unsigned not null);insert into seq_table values (0);接着用以下操作检索出序列号:update seq_table set seq = LAST_INSERT_ID( seq + 1 );select LAST_INSERT_ID();通过修改seq+1中的常数值,可生成不同步长的序列,如seq+10可生成步长为10的序列。
该方法可用于计数器,在数据表中插入多行以记录不同的计数值。再配合LAST_INSERT_ID()函数的返回值生成不同内容的计数值。这种方法的优点是不用事务或LOCK,UNLOCK表就可生成唯一的序列编号。不会影响其它客户程序的正常表操作

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhuyingxi/archive/2009/04/13/4070679.aspx
分享到:
评论

相关推荐

    MySQL AUTO_INCREMENT 主键

    而`AUTO_INCREMENT`属性则是在MySQL数据库系统中为某些整数类型的主键自动分配唯一值的功能。下面我们将深入探讨`AUTO_INCREMENT`与主键的相关知识点。 #### 1. 主键 (Primary Key) 主键是指在一个数据表中能够...

    python mysql自增字段AUTO_INCREMENT值的修改方式

    在MySQL中,AUTO_INCREMENT是用来指定一个字段为自动增长的字段,通常用于设置主键(primary key)。当向表中插入新记录时,无需手动指定这个字段的值,MySQL会自动为该字段生成一个唯一的递增值。 在Python中,...

    Mysql auto_increment 重新计数(让id从1开始)

    在MySQL数据库中,`auto_increment` 是一个非常重要的特性,它允许在插入新记录时自动为某个整数字段(通常是主键)生成唯一的递增值。当你清空一个具有`auto_increment`字段的表,然后重新插入数据时,可能会发现这...

    解析mysql中的auto_increment的问题

    MySQL中的auto_increment是一种非常实用的属性,用于为表中的记录自动生成唯一的ID。这通常用于主键字段,确保每条记录都可以通过一个唯一的标识符进行区分。然而,auto_increment在处理记录删除、数据库重启以及...

    mysql中自增auto_increment功能的相关设置及问题

    要查看MySQL中的自增设置,可以使用`SHOW VARIABLES LIKE '%auto_increment%'`命令。这将显示两个关键变量: - `auto_increment_increment`:定义了自增字段每次递增的步长,默认值为1,即每次递增1。 - `auto_...

    怎么重置mysql的自增列AUTO_INCREMENT初时值

    在MySQL数据库中,自增列(AUTO_INCREMENT)是一种非常有用的特性,它允许表中的某列在插入新记录时自动递增其值。当你需要重置这个初始值时,可能是因为数据库进行了一些清理操作或者需要从特定数值开始重新计数。...

    blog_auto_increment

    在数据库管理中,自动递增(Auto Increment)是一个非常重要的概念,尤其在关系型数据库如MySQL、PostgreSQL、SQLite等中广泛使用。 在MySQL中,`AUTO_INCREMENT`关键字用于定义整数列,当插入新行时,如果未指定该...

    MySQL 序列 AUTO_INCREMENT详解及实例代码

    `AUTO_INCREMENT`是MySQL中用于生成序列的关键特性,它简化了创建唯一标识符的过程,并且在插入数据时自动处理递增。通过了解如何定义、插入、获取和重置序列,你可以更有效地管理和维护包含自增主键的表。在实际...

    mysql 双向同步的键值冲突问题的解决方法

    总的来说,解决MySQL双向同步中的键值冲突问题,关键在于利用`auto_increment_offset`和`auto_increment_increment`参数,合理规划每个服务器的自增长ID序列,以确保数据的一致性和完整性。同时,为了保证整个系统的...

    关于MySQL innodb_autoinc_lock_mode介绍

    MySQL的InnoDB存储引擎在处理带有`auto_increment`列的表时,会受到`innodb_autoinc_lock_mode`参数的影响。这个参数决定了插入数据时如何管理自动递增锁,从而在性能和数据安全性(主从数据一致性)之间取得平衡。 ...

    oracle迁移mysql自增序列问题

    使用`ALTER TABLE`语句可以轻松地将`id`字段转换为`AUTO_INCREMENT`,但需要注意的是,这样做会丢失原有的自增序列设置,新的记录会从1开始递增。 为了解决这个问题,我们需要在转换之前确定现有数据的最大值,然后...

    MySQL自增长键理解

    MySQL中的自增长键是一种特殊类型的字段,主要用于主键,它能自动递增其数值,无需在插入新记录时显式指定。自增长键对于数据库管理非常有用,因为它简化了插入操作,尤其是当需要唯一标识符时。理解自增长键的工作...

    identity:用于MySql数据库

    当创建一个新表时,如果希望某列作为主键并能够自动递增,可以在定义该列时指定`auto_increment`属性。例如: ```sql CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50), password...

    mysql个人使用经验

    例如,SQL Server 使用 `IDENTITY(GeneratedValue, IncrementValue)` 来定义自动递增字段,而在MySQL中则使用 `AUTO_INCREMENT`。 了解并熟练运用这些基本操作,将使你在使用MySQL时更加得心应手。不断实践和探索,...

    Mysql面试题主键自增

    自增(AUTO_INCREMENT)属性则使得每次插入新记录时,主键字段的值会自动递增,无需手动输入。 一、主键的概念 主键是关系数据库中用来唯一标识一条记录的字段,它的主要功能包括: 1. 唯一性:确保表中的每一行都...

    PostgreSQL AUTO INCREMENT(自动增长)

    在PostgreSQL数据库中,"AUTO_INCREMENT"特性是通过序列(Sequences)来实现的,它在新记录插入到表中时会自动生成一个唯一的数字。序列是一种特殊的数据类型,可以生成一系列连续的整数,用于为表中的字段赋值。在...

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

    首先需要了解的是,Oracle数据库并不像MySQL中那样提供一个AUTO_INCREMENT的属性,而是通过序列(SEQUENCE)和触发器(TRIGGER)来实现类似的功能。序列生成一系列的数字,而触发器则在插入新记录时使用这些数字。 ...

    mysql自增字段重排 mysql删除表后自增字段从1开始.pdf

    在MySQL数据库中,自增字段(AUTO_INCREMENT)是一种常见的特性,用于在插入新记录时自动为该字段生成唯一的序列编号。这个字段通常用于主键,确保每个记录的唯一性。以下是对MySQL自增字段相关知识点的详细说明: ...

Global site tag (gtag.js) - Google Analytics