This Domain(Admin5.com) is for Sale:

My SQL数据库实用技术(08)

时间:2007-12-23  来源:不详  作者:迈克DB

■ 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 执行逐行的删除操作,如下所示:
copyright dedecms


假如使用的是3 . 2 3以上的版本,怎样保持严格的增量序列?方法之一是保持一个只用来生成A U TO_INCREMENT 值的独立的表,永远不从这个表中删除记录。在这种情况下,独立表中的值永远不会重用。在主表中需要生成一个新记录时,首先在序列编号表中插入一个N U L L。然后对希望包含序列编号的列使用L A S T _ I N S E RT_ID( ) 的值将该记录插入主表,如下所示:

假如想要编写一个生成A U TO_INCREMENT 值的应用程序,但希望序列从100 而不是1开始。再假定希望这个程序可移植到所有MySQL 版本。怎样来完成它呢?假如可移植是一个目标,那么不能依靠MySQL 3.23 所提供的在C R E ATE TABLE 语句中指定初始序列编号的功能。而是在想要插入一个记录时,首先用下列语句检查表是否是空的:

这个步骤虽然是附加的,但不会花费太多的时间,因为没有WHERE 子句的SELECT COUNT(*) 是优化的,返回很快。假如表是空的,则插入记录并明确地对序列编号列指定值1 0 0。假如表不空,则对序列编号列值指定NULL 使MySQL 自动生成下一个编号。此方法答应插入序列编号为1 0 0、101 等的记录,它不管MySQL 是否答应指定初始序列值都能正常工作。假如要求序列编号即使是从表中删除了记录后也要严格递增,则此方法不起作用。在这样的情形下,可将此方法与前面描述的什么也不做只是用来产生用于主表的序列编号的辅助表技术结合使用。为什么会希望从一个大于1 的序列编号开始呢?一个原因是想使所有序列编号全都具有相同的数字位数。假如需要生成顾客ID 号,并且希望不要多于一百万个顾客,则可以从1 000 000

dedecms.com


开始编号。在对顾客ID 值计数的数字位数改变之前,可以追加一百万个顾客。当然,强制序列编号为一个固定宽度的另一个方法是采用ZEROFILL 列。对于有的情形,这样做有可能会出问题。例如,假如在Perl 或

看完这篇,您有何感觉呢?

文章评论

共有位Admini5网友发表了评论 查看完整内容

24小时热门信息