MySQL中auto_increment有什么作用?

Posted 追光者♂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL中auto_increment有什么作用?相关的知识,希望对你有一定的参考价值。

目录

问题来源

很多时候,mysql语句中会出现【auto_increment】这个词汇,大多数时候,表都是自动生成的,刚开始学习MySQL数据库时会学习到,后来,渐渐地可能会忘记,那么这个语句的作用到底是什么意思?下面,来汇总一下:

解释

auto_increment是用于主键自动增长的,从1开始增长,当你把第一条记录删除时,再插入第二条数据时,主键值是2,不是1。

例如:

create table test

(

id int(10) not null auto_increment, – 表示自增列

name varchar(20) not null,

primary key(id)

)

auto_increment = 1; – 表示自增起始大小-- 这样就可以创建一个表test,id为自增列

– 执行语句 insert into test (name) values (‘名字’);

– 就可以插入一行数据为: 1 ‘名字’

注意事项

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

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

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

3、AUTO_INCREMENT数据列必须有唯一索引,以避免序号重复(即是主键或者主键的一部分)。
AUTO_INCREMENT数据列必须具备NOT NULL属性。

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

5、当进行全表删除时,MySQL AUTO_INCREMENT会从1重新开始编号。

这是因为进行全表操作时,MySQL(和php搭配之最佳组合)实际是做了这样的优化操作:先把数据表里的所有数据和索引删除,然后重建数据表。

如果想删除所有的数据行又想保留序列编号信息,可这样用一个带where的delete命令以抑制MySQL(和PHP搭配之最佳组合)的优化:delete from table_name where 1;

可用last_insert_id()获取刚刚自增过的值。

说明:部分内容来自搜索整理,目的是为了记录总结,学习使用~

在 MySQL 中重置 AUTO_INCREMENT 需要很长时间

【中文标题】在 MySQL 中重置 AUTO_INCREMENT 需要很长时间【英文标题】:Resetting AUTO_INCREMENT is taking a long time in MySQL 【发布时间】:2011-02-10 12:45:40 【问题描述】:
ALTER TABLE tablename AUTO_INCREMENT = 10000000

此查询需要很长时间才能更新。为什么?我需要优化这个查询。

【问题讨论】:

为什么需要这个查询?看起来您的表根本不需要自动增量主键。表结构是什么?这种重置的目的是什么?无论如何,重建索引总是消耗资源的操作。我希望你不是经常需要它 嗨 Sharpnel,非常感谢您的快速回复。在我们的网站上有用户生成的数据和管理员生成的数据。我们也有大量用户.. 在这种情况下,如果管理员需要插入和更新大量数据并且我们不想将 id 与用户数据冲突,那么我们通过重置自动增量来保留 id并在多个表中使用相同的插入和更新。由于我们正在进行批量插入和更新,因此我们将查询写入文本文件并通过命令行进行,希望您理解我的问题。请帮忙 【参考方案1】:

ALTER TABLE 会导致整个表的重建 - 如果您的表包含许多行,这可能需要很长时间。

如果您只需要提高 auto_increment 值的值,最快的方法是插入一个虚拟行(如果需要,然后删除该行)。这只需要几分之一秒,而对于一个大表来说,ALTER TABLE 可能需要几天时间。

例如,假设我有一个带有 auto_increment ID 列和其他列 col1、col2...的表:

insert into autoinc_table set ID = 10000000;
delete from autoinc_table where ID = 10000000;

【讨论】:

这似乎没有解决我的问题,即 int id 字段用完了 id。删除行本身并没有帮助,插入行似乎也不会触发它重置其自动增量值。 这个技巧只有在你想增加自动增量值时才有效。听起来你想减少它。【参考方案2】:

用户和管理员数据不能通过 id 来区分,而是通过另一个字段来区分。 如果您将 id 视为没有其他含义的抽象标识符,它将为您节省大量时间和资源,相信我。

【讨论】:

你的意思是有另一个列,例如user_type,还是有另一个表,里面有一个用户目录? @Pathros 取决于您的需求

以上是关于MySQL中auto_increment有什么作用?的主要内容,如果未能解决你的问题,请参考以下文章

mysql中auto_increment(整数)的限制是多少

在 MySQL 中重置 AUTO_INCREMENT 需要很长时间

在 MySQL 中重置 AUTO_INCREMENT 需要很长时间

在 MySQL 中重置 AUTO_INCREMENT 需要很长时间

在 MySQL 中重置 AUTO_INCREMENT 需要很长时间

在 MySQL 中重置 AUTO_INCREMENT 需要很长时间