暂无 |

8 数值栏位型态与AUTO_INCREMENT

在资料库的应用中,很常会遇到为纪录「编流水号」的需求,如果资料表中的每一笔纪录都需要一个递增的数值编号,你可以选择整数型态的栏位后,再使用「AUTO_INCREMENT」栏位属性:

mysql_09_snap_74

如果一个公司想要储存员工开会的资料,你可以在建立开会资料表格的时候,为这个表格定义一个储存开会编号的栏位,这个栏位需要自动递增,而且会为它建立主索引键:

mysql_09_snap_75

建立开会资料表格以后,另外建立一个储存参加会议的员工资料表格:

mysql_09_snap_76

设定为「AUTO_INCREMENT」的整数栏位,在新增资料的时候可以不用指定数值,MySQL会为你自动编制一个流水号并储存在纪录中;而接着要新增参加这次开会的员工资料到「participate 」表格时,你需要用到MySQL刚才会为你在「meeting」表格中自动编制的流水号,这样的需求可以使用「LAST_INSERT_ID()」函式来取得:

mysql_09_snap_77

新增这些开会与参加会议的员工资料后,就可以使用结合查询来查询开会资料了:

mysql_09_snap_78

在新增资料时,要让MySQL为你自动编制一个流水号,并储存到纪录中的方式有​​下列几种:

mysql_09_snap_79

MySQL是一个可以让多人同时使用的资料库,使用「LAST_INSERT_ID()」函式来取得自动编制的流水号数值,并不会因为不同的用户端同时使用而造成混乱:

mysql_09_snap_80

「AUTO_INCREMENT」栏位的一般用法通常是用来储存从「1」开始的流水号,每一笔新增的纪录都会自动加一成为新的编号。可是如果在新增纪录的时候,自己指定「AUTO_INCREMENT」栏位一个数值,就会造成下列的情况:

mysql_09_snap_81

「AUTO_INCREMENT」栏位在你删除纪录以后,也不会帮你重新使用已经用过的编号:

mysql_09_snap_82

注:使用「TRUNCATE TABLE」叙述删除包含「AUTO_INCREMENT」栏位表格的所有纪录,编号会重新从头开始。

不要指定值,或是指定「NULL」值给「AUTO_INCREMENT」栏位,都可以让MySQL为你自动编制一个流水号,并储存到纪录中,这两种也是比较好的方式;另外指定「AUTO_INCREMENT」栏位值为「0」的方式也可以,不过会因为MySQL资料库伺服器的环境设定而有不同的效果:

mysql_09_snap_83

如果你需要编制的流水号范围是非常大的,你应该选择「AUTO_INCREMENT」栏位的型态为「BIGINT」;MySQL另外提供一个「SERIAL」关键字,让你在定义这种栏位时可以比较方便一些:

mysql_09_snap_84

使用「MyISAM」储存引擎的表格,可以使用下列这种比较特殊的「AUTO_INCREMENT」栏位:

mysql_09_snap_85

这样的设定同样是请MySQL为你自动编制流水号,不过因为「AUTO_INCREMENT」栏位包含在主索引键中,编制流水号的动作会不太一样:

mysql_09_snap_86

注:在上列的范例中,是把「empno,location,counter」设定为主索引键;如果设定为唯一索引的话,也会有一样的效果;设定为一般索引的话,会造成错误。

使用「AUTO_INCREMENT」栏位属性有下列几个重点:

  • 一个表格只能有一个「AUTO_INCREMENT」栏位,而且要为它建立一个索引,而且通常是建立主索引键或唯一索引,这样可以防止重复的编号;不过MySQL也允许你建立可重复的索引
  • 只有整数型态才可以使用「AUTO_INCREMENT」栏位属性,你可以根据编号大小的需求,选择使用「TINYINT」、「SMALLINT」、「MEDIUMINT」、「INT」或「BIGINT」,而且因为只会使用到正数,所以你可以加入「UNSIGNED」来增加编号的范围
  • 如果编号已经到栏位型态的最大范围,例如一个「SMALLINT」型态,而且是指定为「UNSIGNED」的「AUTO_INCREMENT」栏位,编号已经到「65535」了,如果再执行新增的叙述,就会造成「Duplicate entry '65535′ for key '栏位名称'」的错误

0

java教程
php教程
php+mysql教程
ThinkPHP教程
MySQL
C语言
css
javascript
Django教程

发表评论

    评价:
    验证码: 点击我更换图片
    最新评论