|
|
 |
 |
|
|
 |
|
MySQL数据库技术(08)
|
|
|
|
编辑:华夏媒体 作者:未知 来源:网络 时间:2006-07-29 总浏览量:2157 |
|
文字大小:[ 大 中 小 ]
文字颜色: 双击滚屏/单击停止 |
|
[上一页] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [下一页]
|
■ 如果插入一个记录并明确指定A U TO_INCREMENT 列的一个值,将会发生两件事之一。如果已经存在具有该值的某个记录,则出错,因为A U TO_INCREMENT 列中的值必须是惟一的。如果不存在具有该值的记录,那么新记录将被插入,并且如果新记录的A U TO_INCREMENT 列中的值是新的最大值,那么后续行将用该值的下一个值。换句话说,也就是可以通过插入一个具有比当前值大的序列值的记录,来增大序列的计数器。增大计数器会使序列出现空白,但这个特性也有用。例如创建一个具有A U TO _INCREMENT 列的表,但希望序列从1000 而不是1 开始。则可以用后述的两种办法之一达到此目的。一个办法是插入具有明确序列值1000 的第一个记录,然后通过插入NULL 到A U TO_INCREMENT 列来插入后续的记录。另一个办法是插入 A U TO_INCREMENT 列值为999 的假记录。然后第一个实际插入的记录将得到一个序列号1 0 0 0,这时再将假记录删除。 ■ 如果将一个不合规定的值插入A U TO_INCREMENT 列,将会出现难以预料的结果。 ■ 如果删除了在A U TO_INCREMENT 列中含有最大值的记录,则此值在下一次产生新值时会再次使用。如果删除了表中的所有记录,则所有值都可以重用;相应的序列重新从1开始。 ■ REPLACE 语句正常起作用。 ■ U P D ATE 语句按类似插入新记录的规则起作用。如果更新一个A U TO _ I N C R E M E N T列为NULL 或0,则会自动将其更新为下一个序列号。如果试图更新该列为一个已经存在的值,将出错(除非碰巧设置此列的值为它所具有的值,才不会出错,但这没有任何意义)。如果更新该列的值为一个比当前任何列值都大的值,则以后序列将从下一个值继续进行编号。 ■ 最近自动产生的序列编号值可调用L A S T _ I N S E RT_ID( ) 函数得到。它使得能在其他不知道此值的语句中引用A U TO_INCREMENT 值。L A S T _ I N S E RT_ID( ) 依赖于当前服务器会话中生成的A U TO_INCREMENT 值; 它不受与其他客户机相关的A U TO_INCREMENT 活动的影响。如果当前会话中没有生成A U TO_INCREMENT 值,则L A S T _ I N S E RT_ID( ) 返回0。能够自动生成顺序编号这个功能特别有用。但是刚才介绍的A U TO_INCREMENT 性能有两个缺陷。首先,序列中顶上的记录被删除时,序列值的重用使得难于生成可能删除和插入记录的应用的一系列单调(严格递增)值。其次,利用从大于1的值开始生成序列的方法是很笨的。 (2) MySQL 3.23 版以后的A U TO_INCREMENTMySQL 3.23 对A U TO_INCREMENT 的性能进行了下列变动以便能够处理上述问题: ■ 自动顺序生成的值严格递增且不重用。如果最大的值为143 并删除了包含这个值的记录,MySQL 继续生成下一个值1 4 4。 ■ 在创建表时,可以明确指定初始的序列编号。下面的例子创建一个A U TO _ I N C R E -MENT 列seq 从1,000,000 开始的表:
 在一个表具有多个列时(正如多数表那样),最后的A U TO_INCREMENT = 1000000子句应用到哪一列是不会混淆的,因为每个表只能有一个A U TO_INCREMENT 列。 (3) 使用A U TO_INCREMENT 应该考虑的问题在使用A U TO_INCREMENT 列时,应该记住下列要点: ■ A U TO_INCREMENT 不是一种列类型,它只是一种列类型属性。此外, A U TO _INCREMENT 是一种只能用于整数类型的属性。MySQL 早于3.23 的版本并不严格服从这个约束,允许定义诸如CHAR 这样的列类型具有A U TO_INCREMENT 属性。但是只有整数类型作为A U TO_INCREMENT 列正常起作用。 ■ A U TO_INCREMENT 机制的主要目的是生成一个正整数序列,并且如果以这种方式使用,则A U TO_INCREMENT 列效果最好。所以应该定义A U TO_INCREMENT 列为U N S I G N E D。这样做的优点是在到达列类型的取值范围上限前可以进行两倍的序列编号。在某些环境下,也有可能利用A U TO_INCREMENT 列来生成负值的序列,但是我们不建议这样做。如果您决定要试一下,应该保证进行充分的试验,并且在升级到不同的MySQL 版本时需要重新测试。笔者的经验表明,不同的版本中,负序列的性能并不完全一致。 ■ 不要认为对某个列定义增加A U TO_INCREMENT 是一个得到无限的编号序列的奇妙方法。事实并非这样; A U TO_INCREMENT 序列受基础列类型的取值范围所限制。例如,如果使用TINYINT UNSIGNED 列,则最大的序列号为2 5 5。在达到这个界限时,应用程序将开始出现“重复键”错误。 ■ MySQL 3.23 引入了不重用序列编号的新A U TO_INCREMENT 性能,并且允许在C R E ATE TABLE 语句中指定一个初始的序列编号。这些性能在使用下列形式的DELETE 语句删除了表中所有记录后可以撤消:
 在此情形下,序列重新从1开始而不按严格的增量顺序继续增加。即使在C R E AT ETABLE 语句中明确指定了一个初始的序列编号,相应的序列也会从头开始。出现这种情形的原因在于MySQL 优化完全删空一个表的DELETE 语句的方法上;它从头开始重新创建数据文件和索引文件而不是去删除每个记录,这样就丢失了所有的序列号信息。如果要删除所有记录,但希望保留序列信息,可以取消优化并强制MySQL 执行逐行的删除操作,如下所示:
|
|
[上一页] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [下一页]
|
|
|
打印 收藏 关闭 至顶部 |
|
 |
|