从MySQL中获得数据表auto_increment值的方法

问题是这样的:在插入一行数据前就想要知道将要产生的id。比如说想用来命名上传的文件。如果不事先获得id就不知道文件名,就没法在插入时把文件路径保存到数据库里了。如果不需要事先获得id,大可以在插入后调用mysql_insert_id()或者执行select last_insert_id(),就不必往下看了。为了照顾性急的同学,先给答案:


$result = mysql_query("show table status like 'tablename'");
$id = mysql_result($result, 0, 'Auto_increment');


其中tablename要换成数据表名,$id就是auto_increment列的下一个值。只有这种办法好用,php的 mysql_insert_id(),MySQL的select last_insert_id()、select @@last_insert_id、select @@insert_id、select @@identity全都不行。想知道为什么的话继续往下看。

首先要搞清一点,除非手动指定,auto_increment是不用重复值的。比如说你新建一张表,然后插入3行数据,id值是1、2、3,没有问题。如果你把2、3那两行删掉,然后再插入一行数据,它的id值是多少呢?是2么?是4!也许有的同学会想:不对呀?MySQL参考手册上不是写了么:

当您向一个已编入索引的AUTO_INCREMENT列中插入一个NULL值(建议)或0时,此列被设置为下一个序列的值。通常情况下为value+1,此处value是当前在表中的列的最大值。

没错,但是MySQL参考手册上也写了:

如果您删除的行中包括用于AUTO_INCREMENT列的最大值,则该值被重新用于BDB表,但是不会被用于MyISAM表或InnoDB表。

BDB是啥?查了一下,是BerkeleyDB。我看了一下我的MySQL 5.0.51b,根本找不到这个引擎啊。依我看,这两条根本就是自相矛盾,而试验的结果是前者错后者对。所以下面这种写法就不行了:

select max(id)+1 from tablename

那么php的mysql_insert_id()函数呢?php手册上写着:

如果上一查询没有产生AUTO_INCREMENT的值,则mysql_insert_id()返回0。

那么如果刚刚删除了一行数据现在又想插入怎么办呢?显然想在插入前取到值是不能用它的。那么MySQL的last_insert_id()函数呢?MySQL参考手册里说:

LAST_INSERT_ID() LAST_INSERT_ID(expr)
自动返回最后一个INSERT或UPDATE问询为AUTO_INCREMENT列设置的第一个发生的值。

那么如果是在第一次插入数据之前呢?如果数据服务器重启了呢?显然也不能用。而且奇怪的是,我试验的结果是这个函数一直返回0,不知怎么搞的。全局变量我也试了,个个都为0,真神了。

综上,只有show table status不受任何限制,可以随时获得数据表的auto_incerement值。它是查询表状态的数据库管理语句,同时还返回好多有用的信息,比如数据引擎、创建时间、整理(校对)字符集什么的。因为语法不支持嵌套进select里,也只有全部查出来了。这下就不用管什么插入前后啦!
### MySQL `AUTO_INCREMENT` 插入数据的方法MySQL 中,当一个表的字段设置了 `AUTO_INCREMENT` 属性时,该字段会在每次插入新记录时自动生成一个唯一的递增。以下是一些关于如何使用 `AUTO_INCREMENT` 插入数据的关键点和方法[^3]。 #### 1. 不指定 `AUTO_INCREMENT` 字段 如果表中某字段被设置为 `AUTO_INCREMENT`,则在插入数据时可以不为该字段提供MySQL 会自动为该字段生成一个递增的。 ```sql INSERT INTO table_name (column1, column2) VALUES ('value1', 'value2'); ``` 在上述语句中,`table_name` 是包含 `AUTO_INCREMENT` 字段的表名,而 `column1` 和 `column2` 是其他非 `AUTO_INCREMENT` 字段。此时,`AUTO_INCREMENT` 字段的将由 MySQL 自动生成。 #### 2. 显式插入 `NULL` 或 `0` 即使字段设置了 `AUTO_INCREMENT`,也可以通过显式插入 `NULL` 或 `0` 来触发自动生成的递增。 ```sql INSERT INTO table_name (id, column1, column2) VALUES (NULL, 'value1', 'value2'); ``` 或者: ```sql INSERT INTO table_name (id, column1, column2) VALUES (0, 'value1', 'value2'); ``` 在这种情况下,`id` 字段会被 MySQL 自动赋为下一个可用的递增。 #### 3. 批量插入数据 在批量插入数据时,同样可以省略 `AUTO_INCREMENT` 字段或为其插入 `NULL` [^3]。 ```sql INSERT INTO table_name (column1, column2) VALUES ('value1', 'value2'), ('value3', 'value4'); ``` #### 4. 获取最后插入的 `AUTO_INCREMENT` 在插入数据后,可以通过 `LAST_INSERT_ID()` 函数获取最近插入的 `AUTO_INCREMENT` [^3]。 ```sql SELECT LAST_INSERT_ID(); ``` 此函数返回的是当前会话中最后一次插入操作生成的 `AUTO_INCREMENT` ,因此在多用户环境中仍然可以确保准确性。 #### 注意事项 - 如果删除了表中的所有数据(例如使用 `DELETE FROM table_name;` 或 `TRUNCATE TABLE table_name;`),`AUTO_INCREMENT` 的计数器行为可能会有所不同。`TRUNCATE` 操作会重置计数器,而 `DELETE` 则不会[^2]。 - 确保 `AUTO_INCREMENT` 字段是主键或具有唯一性约束,否则可能导致重复问题[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值