从MySQL中获得数据表auto_increment值(基数)的方法
来源:互联网 发布:7z解压软件 编辑:程序博客网 时间:2024/05/29 04:36
问题是这样的:在插入一行数据前就想要知道将要产生的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参考手册上不是写了么:
没错,但是MySQL参考手册上也写了:
BDB是啥?查了一下,是BerkeleyDB。我看了一下我的MySQL 5.0.51b,根本找不到这个引擎啊。依我看,这两条根本就是自相矛盾,而试验的结果是前者错后者对。所以下面这种写法就不行了:
那么php的mysql_insert_id()函数呢?php手册上写着:
那么如果刚刚删除了一行数据现在又想插入怎么办呢?显然想在插入前取到值是不能用它的。那么MySQL的last_insert_id()函数呢?MySQL参考手册里说:
自动返回最后一个INSERT或UPDATE问询为AUTO_INCREMENT列设置的第一个发生的值。
那么如果是在第一次插入数据之前呢?如果数据服务器重启了呢?显然也不能用。而且奇怪的是,我试验的结果是这个函数一直返回0,不知怎么搞的。全局变量我也试了,个个都为0,真神了。
综上,只有show table status不受任何限制,可以随时获得数据表的auto_incerement值。它是查询表状态的数据库管理语句,同时还返回好多有用的信息,比如数据引擎、创建时间、整理(校对)字符集什么的。因为语法不支持嵌套进select里,也只有全部查出来了。这下就不用管什么插入前后啦!$result = mysql_query("SHOW TABLE STATUS LIKE 'events'");
$values = mysql_fetch_array($result);
$auto_increment_value = $values['Auto_increment'];
- 从MySQL中获得数据表auto_increment值(基数)的方法
- 从MySQL中获得数据表auto_increment值(基数)的方法
- 从MySQL中获得数据表auto_increment值的方法
- MySQL中,AUTO_INCREMENT的困惑?
- mysql中auto_increment的incrementoffset
- MYSQL中设置AUTO_INCREMENT从100开始
- mysql 的AUTO_INCREMENT如何从0开始
- MySQL 修改AUTO_INCREMENT的值
- MySQL 中 AUTO_INCREMENT 的“坑” --重复值问题
- MySQL查询和修改auto_increment的方法
- MySQL查询和修改auto_increment的方法
- mysql数据表中插入数据的方法
- mysql数据库删除数据库以及从数据库中拷贝数据表的方法
- MyBatis 3 中,使用MySql 的AUTO_INCREMENT
- mysql中auto_increment是干什么的?
- 修改MYSQL数据表自增基数
- 从dll中获得.lib的方法
- mysql的auto_increment详解 默认从1开始递增
- 分类的特征选择
- 关于腾讯socket的tgw的转发问题
- UIView的深入研究
- POJ2042 Lagrange's Four-Square Theorem
- /etc/passwd & /etc/shadow 详解
- 从MySQL中获得数据表auto_increment值(基数)的方法
- 处理表重复记录(查询和删除)[整理人:中国风(Roy)]
- PM俱乐部建设之旅1-策划
- 如何在VS2008下调试SGI STL源代码
- SQLite 的日期时间函数
- 百度地图JS版API自定义覆盖物和控件
- 单实例ASM备份集在另一台普通文件管理的机器恢复
- valgrind 检查zefs内存泄漏
- JS中关于正则表达式的基本知识