AUTO_INCREMENT 的性能将在下一小节“使用序列”中作进一步的介绍。 ■ U N S I G N E D。此属性禁用负值。将列定义为UNSIGNED 并不改变其基本数据类型的取值范围;它只是前移了取值的范围。考虑下列的表说明:
itiny 和itiny_u两列都是T I N Y I N T列,并且都可取2 5 6个值,但是i t i n y的取值范围为-12 8 到127,而itiny_u的取值范围为0 到2 5 5。UNSIGNED 对不取负值的列是非常有用的,如存入人口统计或出席人数的列。如果用常规的有符号列来存储这样的值,那么就只利用了该列类型取值范围的一半。通过使列为U N S I G N E D,能有效地成倍增加其取值范围。如果将列用于序列号,且将它设为U N S I G N E D,则可取原双倍的值。在指定以上属性之后(它们是专门用于数值列的),可以指定通用属性NULL 或N O TNULL。如果未指定NULL 或NOT NULL,则缺省为NULL。也可以用D E FA U LT 属性来指定一个缺省值。如果不指定缺省值,则会自动选择一个。对于所有数值列类型,那些可以包含NULL 的列的缺省将为NULL,不能包含NULL 的列其缺省为0。下面的样例创建三个INT 列,它们分别具有缺省值-1、1和NULL:
2. 使用序列 许多应用程序出于标识的目的需要使用唯一的号码。需要唯一值的这种要求在许多场合都会出现,如:会员号、试验样品编号、顾客ID、错误报告或故障标签等等。AUTO_INCREMENT 列可提供唯一编号。这些列可自动生成顺序编号。本节描述AUTO_INCREMENT 列是怎样起作用的,从而使您能够有效地利用它们而不至于出错。另外,还介绍了怎样不用AUTO_INCREMENT 列来产生序列的方法。 (1) MySQL3.23 以前的版本中的AUTO _ I N C R E M E N TMySQL3.23 版以前的AUTO_INCREMENT 列的性能如下: ■ 插入NULL 到AUTO_INCREMENT 列,使MySQL自动地产生下一个序列号并将此序列号自动地插入列中。AUTO_INCREMENT 序列从1开始,因此插入表中的第一个记录得到为1的序列值,而后继插入的记录分别得到序列值2、3 等等。一般,每个自动生成的值都比存储在该列中的当前最大值大1。 ■ 插入0 到AUTO_INCREMENT 与插入NULL 到列中的效果一样。插入一行而不指定AUTO_INCREMENT 列的值也与插入NULL 的效果一样。 ■ 如果插入一个记录并明确指定AUTO_INCREMENT 列的一个值,将会发生两件事之一。如果已经存在具有该值的某个记录,则出错,因为AUTO_INCREMENT 列中的值必须是惟一的。如果不存在具有该值的记录,那么新记录将被插入,并且如果新记录的AUTO_INCREMENT 列中的值是新的最大值,那么后续行将用该值的下一个值。换句话说,也就是可以通过插入一个具有比当前值大的序列值的记录,来增大序列的计数器。增大计数器会使序列出现空白,但这个特性也有用。例如创建一个具有AUTO _INCREMENT 列的表,但希望序列从1000 而不是1开始。则可以用后述的两种办法之一达到此目的。一个办法是插入具有明确序列值1000 的第一个记录,然后通过插入NULL 到AUTO_INCREMENT 列来插入后续的记录。另一个办法是插入 AUTO_INCREMENT 列值为999 的假记录。然后第一个实际插入的记录将得到一个序列号10 0 0,这时再将假记录删除。 ■ 如果将一个不合规定的值插入AUTO_INCREMENT 列,将会出现难以预料的结果。 ■ 如果删除了在AUTO_INCREMENT 列中含有最大值的记录,则此值在下一次产生新值时会再次使用。如果删除了表中的所有记录,则所有值都可以重用;相应的序列重新从1开始。 ■ REPLACE 语句正常起作用。 ■ UPDATE语句按类似插入新记录的规则起作用。如果更新一个AUTO _ I N C R E M E N T列为NULL 或0,则会自动将其更新为下一个序列号。如果试图更新该列为一个已经存在的值,将出错(除非碰巧设置此列的值为它所具有的值,才不会出错,但这没有任何意义)。如果更新该列的值为一个比当前任何列值都大的值,则以后序列将从下一个值继续进行编号。 ■ 最近自动产生的序列编号值可调用L A S T _ INSERT_ID( ) 函数得到。它使得能在其他不知道此值的语句中引用AUTO_INCREMENT 值。L A S T _ INSERT_ID( ) 依赖于当前服务器会话中生成的AUTO_INCREME
没有相关教程