mysql怎么初始化自增值_Mysql设置自增长主键的方法 和 初始值
本文基于一个简单的MySQL自增初始值的例子深入探讨了大量关于MySQL主键获取修改以及一些常用案例。我们共同探讨这些案例,相信会对大家有所帮助。
alter table table_name auto_increment=n;
注意n只能大于已有的auto_increment的整数值,小于的值无效.
查看指定表的状态信息可以显示' table_name '格式中的auto_increment这一列是否存在非空值
步进值没法改变.只能通过下面提到last_inset_id()函数变通使用
MySQL允许通过AUTO_INCREMENT字段属性来实现主键自增功能,默认起始值设置为1;若希望将初始起始值调整至1000,则一种较为繁琐的方式是在建立数据库时先插入一条占位记录,并将该记录的主键字段设为998(以便后续自增),随后删除这条临时占位记录!
代码如下 复制代码
insert into test(pk) values(999);
delete from test where pk = 999;
更好的方法是使用alter的方法来直接修改,例如:
代码如下 复制代码
alter table test AUTO_INCREMENT = 1000;
例子
1、不控制主键的起点
create table emb_t_dictBusType
(
emb_c_busTypeID int not null auto_increment,
emb_c_busTypeEnName varchar(255) not null,
emb_c_busTypeZhName varchar(255) not null,
primary key(emb_c_busTypeID)
)engine=INNODB default charset=gbk;
2、控制主键的起点
create table emb_t_dictBusType
(
emb_c_busTypeID int not null auto_increment,
emb_c_busTypeEnName varchar(255) not null,
emb_c_busTypeZhName varchar(255) not null,
primary key(emb_c_busTypeID)
)engine=INNODB auto_increment=1001 default charset=gbk;
自增主键归零
方法一:
如果不再需要之前的记录,则可以直接删除现有数据,并将自增字段重新设置为起始值。
truncate table 表名
方法二:
dbcc checkident(’table_name’, reseed, new_reseed_value) 当前已赋值为 new_reseed_value。若自建表后未新增任何记录,则在执行 DBCC CHECKIDENT 操作后插入的第一条记录将采用 new_reseed_value 作为唯一标识符。反之,在随后进行的插入操作中,默认会采用新增量值(即 new_reseed_value + 1)。若新设定的 reseed 值低于标识列的最大容量限制,则未来访问该表时将会触发编号错误信息(错误号:2627)。
该方法无需清除现有数据,并且具有较高的灵活性。不仅能够将自增计数器归零, 同样适用于删除一批连续的数据行后, 重新设置自增计数器并加入新数据;还可以从一个新的基准值开始处理, 当然必须避免与现有数据冲突。
sql="delete from table_vote";
mysql_query(sql, link);
sql="alter table table_vote auto_increment=1";
mysql_query(sql, link);
#控制主键的起点-zencart products_description
- Table structure for table products_description
--
CREATE TABLE IF NOT EXISTS products_description (
products_id int(11) NOT NULL AUTO_INCREMENT,
language_id int(11) NOT NULL DEFAULT '1',
products_name varchar(256) DEFAULT NULL,
products_description text,
products_url varchar(255) DEFAULT NULL,
products_viewed int(5) DEFAULT '0',
PRIMARY KEY (products_id,language_id),
KEY idx_products_name_zen (products_name)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=763515 ;
--
-- Dumping data for table products_description
--
ISAM表
如果向MySQL的AUTO_INCREMENT字段中插入一个NULL值,则该数据库管理系统会自动生成下一个序列号(MySQL与PHP协同工作的最佳搭档))。此序列号从1开始生成,并以1为增量递增。
将数值0插入MySQL AUTO_INCREMENT数据列时的表现等同于直接插入NULL值。然而,并不推荐采用这种方法;相反地,更倾向于采用直接插入NULL的方法。
#不确定是否需要分配auto_increment id,一般是下面两种情况
INSERT INTO t1 (c1,c2) VALUES (1,’a'), (NULL,’b'), (5,’c'), (NULL,’d');
INSERT … ON DUPLICATE KEY UPDATE
当插入记录时,没有为AUTO_INCREMENT明确指定值,则等同插入NULL值。
每当执行一次数据表中的记录插入操作时,在尝试为某个特定的数据字段赋值之前,请注意以下几点:首先,请确定您正在使用的数据类型是否支持您所希望的操作。例如,在设计数据库表结构时已经给某个AUTO_INCREMENT字段分配了一个固定的起始数值的情况下,则可能出现两种不同的处理结果。具体来说:
- 如果您试图在该字段中输入一个与现有记录中的某个已有编号相同的数值(即发生冲突),这将导致系统返回错误信息提示。
- 另一种情况下(即输入的新数值超过现有的最大编码),那么系统会将这个新数值作为实际编码应用到该记录中,并将下一个增量设置为当前最大编码加一。
总体而言,在这种情况下系统能够跳过不需要编码的部分。
如果自增序列的最大值被删除了,则在插入新记录时,该值被重用。
如果使用UPDATE命令来更新自增列,并且该列的值与现有数值重复,则会导致错误;当该列的数值比现有数值大时,则下一个编号将从该数值开始连续递增。
若在replace命令中基于.AUTO字段的值来更新现有记录,则该 AUTO字段中的数值不会受到影响;但若使用其他方式(例如通过 Prima 的 RY键或唯一键进行锁定而非依赖 where 子串)执行 replace操作(即无需依赖 where 子串中的 AUTO字段),则该 AUTO字段中的数值将根据是否已赋值而变化:如果没有赋值,则会自动设为 NULL;否则会保留原有的数值。
该函数用于获取自增列生成的最大值。然而,在单个会话周期内仅基于服务器生成的数据提供此值。若在此对话周期内尚未产生AUTO_INCREMENT数值,则此函数返回零。
其它数据表的自动编号机制都以ISAM表中的机制为基础。
MyISAM数据表
删除最大编号的记录后,该编号不可重用。
可在建表时可用“MySQL AUTO_INCREMENT=n”选项来指定一个自增的初始值。
可用alter table table_name AUTO_INCREMENT=n命令来重设自增的起始值。
能够在同一个数据表中同时建立多个互不干扰的自增序列。具体方法如下:在数据库表中构建一个由多列组成的Prima(最完善的虚拟主机管理系统)RY KEY OR UNIQUE主键索引,并将AUTO_INCREMENT字段作为该主键索引的最后一列包含进去。这样一来,在该复合主键索引中,前面各字段每形成一种独特的组合时,最后面的AUTO_INCREMENT字段都会自动生成一个与之对应的序列号。
HEAP数据表
HEAP数据表从MySQL(和PHP搭配之最佳组合)4.1开始才允许使用自增列。
自增值可通过CREATE TABLE语句的 MySQL AUTO_INCREMENT=n选项来设置。
可通过ALTER TABLE语句的AUTO_INCREMENT=n选项来修改自增始初值。
编号不可重用。
MySQL的HEAP数据表无法在一个数据表内设置复合索引以实现多个互不影响的序列号生成
BDB数据表
无法通过创建或修改表的AUTO_INCREMENT=n选项来设置自增起始值。
可重用编号。
支持在一个数据表里使用复合索引来生成多个互不干扰的序列编号。
InnDB数据表
在MySQL中,默认情况下使用CREATE TABLE或ALTER TABLE命令时,默认自增计数器设为n,并且无法通过任何设置来调整其初始值。
不可重用编号。
不支持在一个数据表里使用复合索引来生成多个互不干扰的序列编号。
在使用AUTO_INCREMENT时,应注意以下几点:
AUTO_INCREMENT是数据列的一种属性,只适用于整数类型数据列。
指定MySQL数据列为带AUTO_INCREMENT属性的正数序列,则应将其字段声明为UNSIGNED类型。这样一来,则可以使该字段的数据值编号范围能扩大一倍。
AUTO_INCREMENT数据列必须有唯一索引,以避免序号重复。
AUTO_INCREMENT数据列必须具备NOT NULL属性。
数据列序号的最大值由该列的数据类型决定,例如,TINYINT型数据列的最大序号为127.若添加UNSIGNED关键字,则最大值升至255.当达到上限时,AUTO_INCREMENT功能将被终止使用.
在执行全表删除操作时, AUTO_INCREMENT字段的值将被重置为1,以确保数据的正确性与一致性. 全表删除指的是发出以下两条语句时:
delete from table_name;ortruncate table table_name
由于在执行全表操作的过程中,在数据库中先删除了所有的数据以及相关的索引,并且随后又重新构建了整个数据库结构。
delete from table_name where 1;
这将触发MySQL(PHP的最佳搭档)在每条被删除的数据行上评估一个条件表达式。
为了防止重复使用已经存在的序列值,在MySQL(配合PHP)的最佳组合体系下无法复用之前已使用的序列值的方法是:另建一个专为生成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(与PHP最佳组合)将自动生成所有这些记录的唯一标识符。
为了重新组织现有的一组序列号,最直接的方式是先移除这一列,并随后重建它。使用MySQL(与PHP最佳搭档)系统时,在移除某一列后会自动生成连续的编号序列。
若不在MySQL中启用AUTO_INCREMENT自增模式时生成序列,则可采用带有参数的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 );
调用LAST_INSERT_ID()函数;通过调整seq+1中的固定值,从而实现步长的变化;例如将seq设置为+10时,将会得到一个步长为10的序列.
此方法可应用于计数器功能,在数据库表中增殖多条记录来记录不同的计数值;并结合LAST_INSERT_ID()函数返回的值来生成不同内容的计数值;其优点在于无需事务操作或LOCK机制即可通过UNLOCK表自动生成唯一序列编号;也不会对其他应用程序在处理这些表时造成任何干扰
