用法:
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表就可生成唯一的序列编号。不会影响其它客户程序的正常表操作。
网友评论
coding
经过试验,发现对于有auto_increment字段的表,使用如下两条语句来清空表时效果是不一样的:
(1)delete from a;不复位id
(2)truncate table a;复位id,从1开始计数;
原文链接:
http://blog.chinaunix.net/u1/48901/showart.php?id=392987
分享到:
相关推荐
例如,在创建用户信息表 Userinfo 时,我们可以将 User_ID 字段设置为 auto_increment,以便在插入数据时自动增长: ```sql CREATE TABLE UserInfo ( User_ID int NOT NULL PRIMARY KEY AUTO_INCREMENT, Name ...
在数据库设计中,自增字段(自动增长字段)是非常常见的一种需求。它主要用于为主键提供唯一且连续递增的标识符,便于记录数据条目的唯一性。不同的数据库系统支持不同的自增字段创建方式。本文将详细介绍几种主流...
MySQL 字段约束是指在 MySQL 中对字段的定义时添加的约束或修饰符,它们可以用来增加对输入数据的约束。今天我们来看一下 MySQL 的字段约束:NULL 和 NOT NULL 修饰符、DEFAULT 修饰符、AUTO_INCREMENT 修饰符。 ...
在SQL中,获取自动增加字段的下一个编号是一个常见的需求,尤其是在处理数据库表的自增主键时。传统的做法是通过查询当前表中的最大ID值(`MAX(id)`),然后在此基础上加1来得到下一个可用的ID。然而这种方法存在...
实现mysql 每天定时自动给数据库表追加分区,包含存储计划和存储过程
MySQL大表增加字段是一项常见的数据库管理任务,但随着表数据量的增长,直接在表结构上进行修改可能会引发性能问题甚至导致长时间的服务中断。为了解决这个问题,Percona Toolkit提供了强大的工具,如`pt-online-...
自增字段的默认行为是每次插入新记录时自动增加一个整数值,从1开始并递增。然而,当删除记录或有特殊操作时,自增字段的行为可能会有所变化。 在MyISAM表中,如果删除了具有最大自增值的记录,这个值将不再被重用...
在MySQL中,AUTO_INCREMENT是用来指定一个字段为自动增长的字段,通常用于设置主键(primary key)。当向表中插入新记录时,无需手动指定这个字段的值,MySQL会自动为该字段生成一个唯一的递增值。 在Python中,...
在MySQL数据库中,自动增长字段是一种非常有用的特性,尤其是在需要为主键分配唯一标识符的情况下。通过设置一个列的`AUTO_INCREMENT`属性,每当向表中插入新记录时,该列的值会自动递增。这种方式极大地简化了数据...
自增字段,一定要设置为primary key. 以指定从1000开始为例。 1 创建表的时候就设置: CREATE TABLE `Test` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `NAME` varchar(50) NOT NULL, `SEX` varchar(2) NOT NULL...
在IT行业中,数据库管理是至关重要的,特别是在大数据时代,数据量的增长速度往往超过单个数据库的处理能力。MySQL作为一款广泛使用的开源关系型数据库,面对海量数据时,分表策略是一种有效的优化手段。本文将详细...
例如,要创建一个包含id、创建时间(createtime)等基础字段的表,可以编写如下代码: ```php M()->execute("CREATE TABLE `users` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `createtime` DATETIME DEFAULT ...
这通常适用于那些设置为自动增长的字段,比如MySQL中的`AUTO_INCREMENT`字段。在执行插入操作后,MyBatis会自动获取并设置到对应Java对象的属性中。 `keyColumn`属性则用于指定数据库表中的主键列名,即自增长字段...
id 列是自动增加的主键,name 列是字符类型,age 列是整数类型。 MySQL 基础知识 在使用 MySQL 之前,需要了解一些基础知识: * SQL 语句:SQL(Structured Query Language)是用于管理关系数据库的语言。常用的 ...
如果你想为新字段指定一个默认值,可以在创建字段时直接定义。例如,我们可以为`birth2`字段设置默认值为'2013-01-01': ```sql alter table test add column birth2 date default '2013-01-01'; ``` 这将会确保`...
Auto Increment 是 MySQL 数据库的一个特性,可以自动增加列的值。我们可以使用 Auto Increment 来指定 ORDER_NO 列的值可以被 MySQL 数据库自动控制。 知识点七:Collation 属性 Collation 属性是 MySQL 数据库的...
例如,创建一个名为`stu`的表,其中`stuid`字段是自动增长的主键,正确创建表的语句如下: ```sql CREATE TABLE stu ( stuid INT AUTO_INCREMENT PRIMARY KEY, stuname VARCHAR(10), stusex CHAR(2), stuage ...
3. serial:自动增长类型,按 Integer 型存储。 4. nchar(size):双字节字符串,每行定长(不足部分补为空格),长度(size)是指字符的个数,最大字节数为 254*2。 5. nvarchar(size):可变长,双字节字符串,每行变...
MySQL增加更新语句生成器是一种实用工具,它旨在简化数据库管理员和开发人员的工作,自动创建或更新MySQL数据库中的SQL语句。这个工具的核心功能在于处理文本标记,以便精确地定位和操作数据。以下是对这些核心知识...