mysql怎么初始化⾃增值_Mysql设置⾃增长主键的⽅法和初始
本⽂章是由⼀个简单的Mysql⾃增初始值的⼀个例⼦引导出⼤量的关于mysql主键获取 修改及⼀些常⽤的例⼦,下⾯我们⼀起来看看希望例⼦对各位会有帮助。
alter table table_name auto_increment=n;
注意n只能⼤于已有的auto_increment的整数值,⼩于的值⽆效.
show table status like ‘table_name’ 可以看到auto_increment这⼀列是表现有的值.
步进值没法改变.只能通过下⾯提到last_inset_id()函数变通使⽤
Mysql可以使⽤AUTO_INCREMENT来设定主键的值为⾃增长的,其默认值是1,如果想把它的初始值设置为1000,⽐较笨的办法是先插⼊⼀条记录并指定主键的值为999,然后delete改⾏记录,例如:
代码如下 复制代码
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;
mysql删除重复的数据保留一条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;
⾃增主键归零
⽅法⼀:
如果曾经的数据都不需要的话,可以直接清空所有数据,并将⾃增字段恢复从1开始计数
truncate table 表名
⽅法⼆:
dbcc checkident (’table_name’, reseed, new_reseed_value) 当前值设置为 new_reseed_value。如果⾃创建表后没有将⾏插⼊该表,则在执⾏ DBCC CHECKIDENT 后插⼊的第⼀⾏将使⽤ new_reseed_value 作为标识。否则,下⼀个插⼊的⾏将使⽤
new_reseed_value + 1。如果 new_reseed_value 的值⼩于标识列中的最⼤值,以后引⽤该表时将产⽣ 2627 号错误信息。
www.111cn
⽅法⼆不会清空已有数据,操作⽐较灵活,不仅可以将⾃增值归零,也适⽤于删除⼤量连续⾏后,重新设置⾃增值并插⼊新的数据;或从新的值开始,当然不能和已有的冲突。
$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表
如果把⼀个NULL插⼊到⼀个AUTO_INCREMENT数据列⾥去,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数据列明确指定了⼀个数值,则会出现两种情况,情况⼀,如果插⼊的值与已有的编号重复,则会出现出错信息,因为AUTO_INCREMENT数据列的值必须是唯⼀的;情况⼆,如果插⼊的值⼤于已编号的值,则会把该插⼊到数据列中,并使在下⼀个编号将从这个新值开始递增。也就是说,可以跳过⼀些编号。
如果⾃增序列的最⼤值被删除了,则在插⼊新记录时,该值被重⽤。
如果⽤UPDATE命令更新⾃增列,如果列值与已有的值重复,则会出错。如果⼤于已有值,则下⼀个编号从该值开始递增。
如果⽤replace命令基于AUTO_INCREMENT数据列⾥的值来修改数据表⾥的现有记录,即AUTO_INCREMENT数据列出现在了replace命令的where⼦句⾥,相应的AUTO_INCREMENT值将不会发⽣变化。但如果replace命令是通过其它的Prima(最完善的虚拟主机管理系统)RY KEY OR UNIQUE索引来修改现有记录的(即AUTO_INCREMENT数据列没有出现在replace命令的where⼦句中),相应的
AUTO_INCREMENT值–如果设置其为NULL(如没有对它赋值)的话–就会发⽣变化。
last_insert_id()函数可获得⾃增列⾃动⽣成的最后⼀个编号。但该函数只与服务器的本次会话过程中⽣成的值有关。如果在与服务器的本次会话中尚未⽣成AUTO_INCREMENT值,则该函数返回0。
其它数据表的⾃动编号机制都以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选项来修改⾃增始初值。
编号不可重⽤。
HEAP数据表不⽀持在⼀个数据表中使⽤复合索引来⽣成多个互不⼲扰的序列编号。
BDB数据表
不可通过CREATE TABLE OR ALTER TABLE的AUTO_INCREMENT=n选项来改变⾃增初始值。
可重⽤编号。
⽀持在⼀个数据表⾥使⽤复合索引来⽣成多个互不⼲扰的序列编号。
InnDB数据表
不可通过CREATE TABLE OR ALTER TABLE的AUTO_INCREMENT=n选项来改变⾃增初始值。
不可重⽤编号。
不⽀持在⼀个数据表⾥使⽤复合索引来⽣成多个互不⼲扰的序列编号。
在使⽤AUTO_INCREMENT时,应注意以下⼏点:
AUTO_INCREMENT是数据列的⼀种属性,只适⽤于整数类型数据列。
设置MySQL 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(和PHP搭配之最佳组合)实际是做了这样的优化操作:先把数据表⾥的所有数据和索引删除,然后重建数据表。如果想删除所有的数据⾏⼜想保留序列编号信息,可这样⽤⼀个带where的delete命令以抑制MySQL(和PHP搭配之最佳组合)的优化:
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()函数。如果⽤⼀个带参数的
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表就可⽣成唯⼀的序列编号。不会影响其它客户程序的正常表操作。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。