对于这样的一个数据库表格:
CREATE TABLE sig_class ( sig_class_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
sig_class_name VARCHAR(60) NOT NULL,
PRIMARY KEY (sig_class_id),
INDEX (sig_class_id),
INDEX (sig_class_name));
插入数据有一个微小但至关重要的方面,那就是AUTO_INCREMENT类型的列。它由MySQl自动分配ID。这一特性非常有用,特别是当你有许多用户的时候。
正如上表所示,sig_calss_id被设置为AUTO_INCREMENT类型。一旦你插入一行,代码如下所示:
insert into sig_class(sig_class_name)values("test1111");
你如何知道插入的sig_class_name被分配了什么数字呢?
若是执行一条select语句来搜索这个sig_class_name的名字,来确定sig_class_id,这样的话效率会很低,并且如果有两个相同名字的类型名,这将不能保证唯一性。或者,如果有多个用户快速地插入数据,那么可能在新操作和SELECT语句之间会有其他行被插入。因为发现一个AUTO_INCREMENT列的值是大家都面临的一个共同问题,所以MySQL以函数LAST_INSERT_ID()的形式专门提供了一个解决方案。无论何时MySQL向AUTO_INCREMENT列中插入数据,MySQL都会基于每个用户对最后分配的值进行跟踪。用户程序可以通过SELECT专门函数LAST_INSERT_ID()来发现该值,这个函数的作用有点像表中的虚拟列。
实例如下所示:
剖析:
每次插入一行,MySQL就分配一个新的id值并且跟踪它,使得你可以用LAST_INSERT_ID()来提取它。如果想通过实验查看返回的数字在本次会话中确实是唯一的,那么你可以打开另一个会话并插入另一行数据。然后在最初的会话中重新执行SELECT LAST_INSERT_ID();语句。你将看到数字并没有发生改变,这是因为该语句返回的数字是当前会话插入的最后一个数字。但是,如果执行SELECT*FROM sig_class,你将看到其他会话确实已插入数据了。