PHP学习笔记
2009-8-8
主题:返回上一步INSERT操作产生的ID
1 要点
1.1 函数mysql_insert_id()
有些时候在执行数据库的INSERT操作后需要知道其产生的ID(我用的MySQL,主键都是设的AUTO_INCREMENT,执行插入操作的时候不用指定ID的值而由数据库自行产生),这时候就可以使用PHP的函数mysql_insert_id()直接获得这个ID,非常方便。
但是有一点,如果在INSERT语句里面明确指出了具有AUTO_INCREMENT属性的ID列的值,那么函数将返回0,因为该ID值是由用户指定的,不是由数据库自动产生的。
PHP手册对该函数的描述如下:
说明
int mysql_insert_id
mysql_insert_id() 返回给定的 link_identifier 中上一步 INSERT 查询中产生的 AUTO_INCREMENT 的 ID 号。如果没有指定 link_identifier,则使用上一个打开的连接。
如果上一查询没有产生 AUTO_INCREMENT 的值,则 mysql_insert_id() 返回 0。如果需要保存该值以后使用,要确保在产生了值的查询之后立即调用 mysql_insert_id()。
1.2 MySQL的API——LAST_INSERT_ID()
1.2.1 MySQL也提供了这么一个同样功能的API,它总是保存着最新产生的AUTO_INCREMENT值,并且不会在查询语句之间被重置,也就是说,在执行INSERT操作后,执行SELECT、UPDATE、DELETE语句都不会影响该API的返回值。
1.2.2 可以用SELECT LAST_INSERT_ID(); 来查询LAST_INSERT_ID() 的返回值。
1.2.3 使用单条INSERT语句插入多条记录,,LAST_INSERT_ID() 只返回插入的第一条记录产生的AUTO_INCREMENT值。
2 总结
2.1 在知道上面两种方法之前,我所用的方法就显得有点麻烦了。我的思路是这样的:
比如有一张表contents,它有3个字段id、name、content,先执行INSERT操作
insert into contents (name,content) values (‘abc’,’test2’)
假设原先表中有一条记录(1,def,test1),那么执行INSERT操作后产生的id应该是2。我把name字段设为了UNIQUE,这样我可以用查询
select id from contents where name=’abc’
来获得我想要的那个id。
这样确实可以得到正确结果,但是毕竟要将name字段设为UNIQUE,万一实际情况下允许name重复呢?所以上面的两种方法,尤其是第一种方法,真是帮了我忙了。
2.2 还有一个问题
在phpMyAdmin中使用这个函数,怎么每次都返回0呢?明明之前的INSERT操作执行正确了的啊,现在还没有找到原因。