Mysql入门系列:MySQL的列类型(2)
2006-12-31 10:47:43 来源:WEB开发网序列不从1开始的另一个原因从技术的角度来说可能不值一提。例如,在分配会员号时,序列号不要从1开始,以免出现关于谁是第一号的政治争论。
(4) 不用AUTO_INCREMENT 生成序列生成序列号的另一个方法根本就不需要使用AUTO_INCREMENT 列。它利用取一个参数的L A S T _ INSERT_ID( ) 函数的变量来生成序列号。(这种形式在MySQL3.22.9. 中引入)如果利用L A S T _ INSERT_ID(expr) 来插入或更新一个列, 则下一次不用参数调用L A S T _ INSERT_ID( ) 时,将返回expr 的值。换句话说,就像由AUTO_INCREMENT 机制生成的那样对expr 进行处理。这样使得能生成一个序列号,然后可在以后的客户会话中利用它,用不着取受其他客户机影响的值。利用这种策略的一种方法是创建一个包含一个值的单行表,该值在想得到序列中下一个值时进行更新。例如,可创建如下的表:
上面的语句创建了表seq_table 并用包含seq 值0 的行对其进行初始化。可利用这个表产生下一个序列号,如下所示:
该语句取出seq 列的当前值并对其加1,产生序列中的下一个值。利用L A S T _ INSERT _ID(seq + 1) 生成新值使它就像一个AUTO_INCREMENT 值一样,而且此值可在以后的语句中通过调用无参数的L A S T _ INSERT_ID( ) 来取出。即使某个其他客户机同时生成了另一个序列号,上述作用也不会改变,因为L A S T _ INSERT_ID( ) 是客户机专用的。如果希望生成增量不是1的编号序列或负增量的编号序列,也可以利用这个方法。例如,下面两个语句可以用来分别生成一个增量为100 的编号序列和一个负的编号序列:
更多精彩
赞助商链接