在资料库的应用中,很常会遇到为纪录「编流水号」的需求,如果资料表中的每一笔纪录都需要一个递增的数值编号,你可以选择整数型态的栏位后,再使用「AUTO_INCREMENT」栏位属性:
如果一个公司想要储存员工开会的资料,你可以在建立开会资料表格的时候,为这个表格定义一个储存开会编号的栏位,这个栏位需要自动递增,而且会为它建立主索引键:
建立开会资料表格以后,另外建立一个储存参加会议的员工资料表格:
设定为「AUTO_INCREMENT」的整数栏位,在新增资料的时候可以不用指定数值,MySQL会为你自动编制一个流水号并储存在纪录中;而接着要新增参加这次开会的员工资料到「participate 」表格时,你需要用到MySQL刚才会为你在「meeting」表格中自动编制的流水号,这样的需求可以使用「LAST_INSERT_ID()」函式来取得:
新增这些开会与参加会议的员工资料后,就可以使用结合查询来查询开会资料了:
在新增资料时,要让MySQL为你自动编制一个流水号,并储存到纪录中的方式有下列几种:
MySQL是一个可以让多人同时使用的资料库,使用「LAST_INSERT_ID()」函式来取得自动编制的流水号数值,并不会因为不同的用户端同时使用而造成混乱:
「AUTO_INCREMENT」栏位的一般用法通常是用来储存从「1」开始的流水号,每一笔新增的纪录都会自动加一成为新的编号。可是如果在新增纪录的时候,自己指定「AUTO_INCREMENT」栏位一个数值,就会造成下列的情况:
「AUTO_INCREMENT」栏位在你删除纪录以后,也不会帮你重新使用已经用过的编号:
注:使用「TRUNCATE TABLE」叙述删除包含「AUTO_INCREMENT」栏位表格的所有纪录,编号会重新从头开始。
不要指定值,或是指定「NULL」值给「AUTO_INCREMENT」栏位,都可以让MySQL为你自动编制一个流水号,并储存到纪录中,这两种也是比较好的方式;另外指定「AUTO_INCREMENT」栏位值为「0」的方式也可以,不过会因为MySQL资料库伺服器的环境设定而有不同的效果:
如果你需要编制的流水号范围是非常大的,你应该选择「AUTO_INCREMENT」栏位的型态为「BIGINT」;MySQL另外提供一个「SERIAL」关键字,让你在定义这种栏位时可以比较方便一些:
使用「MyISAM」储存引擎的表格,可以使用下列这种比较特殊的「AUTO_INCREMENT」栏位:
这样的设定同样是请MySQL为你自动编制流水号,不过因为「AUTO_INCREMENT」栏位包含在主索引键中,编制流水号的动作会不太一样:
注:在上列的范例中,是把「empno,location,counter」设定为主索引键;如果设定为唯一索引的话,也会有一样的效果;设定为一般索引的话,会造成错误。
使用「AUTO_INCREMENT」栏位属性有下列几个重点: