转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> MySql >> 正文
MySQL的列类型(3)         ★★★★

MySQL的列类型(3)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:637 更新时间:2009/4/22 20:43:53
NT 值; 它不受与其他客户机相关的AUTO_INCREMENT 活动的影响。如果当前会话中没有生成AUTO_INCREMENT 值,则L A S T _ INSERT_ID( ) 返回0。能够自动生成顺序编号这个功能特别有用。但是刚才介绍的AUTO_INCREMENT 性能有两个缺陷。首先,序列中顶上的记录被删除时,序列值的重用使得难于生成可能删除和插入记录的应用的一系列单调(严格递增)值。其次,利用从大于1的值开始生成序列的方法是很笨的。
    (2) MySQL3.23 版以后的AUTO_INCREMENTMySQL3.23 对AUTO_INCREMENT 的性能进行了下列变动以便能够处理上述问题:
    ■ 自动顺序生成的值严格递增且不重用。如果最大的值为143 并删除了包含这个值的记录,MySQL继续生成下一个值14 4。
    ■ 在创建表时,可以明确指定初始的序列编号。下面的例子创建一个AUTO _ I N C R E -MENT 列seq 从1,000,000 开始的表:

    在一个表具有多个列时(正如多数表那样),最后的AUTO_INCREMENT = 1000000子句应用到哪一列是不会混淆的,因为每个表只能有一个AUTO_INCREMENT 列。
    (3) 使用AUTO_INCREMENT 应该考虑的问题在使用AUTO_INCREMENT 列时,应该记住下列要点:
    ■ AUTO_INCREMENT 不是一种列类型,它只是一种列类型属性。此外, AUTO _INCREMENT 是一种只能用于整数类型的属性。MySQL早于3.23 的版本并不严格服从这个约束,允许定义诸如CHAR 这样的列类型具有AUTO_INCREMENT 属性。但是只有整数类型作为AUTO_INCREMENT 列正常起作用。
    ■ AUTO_INCREMENT 机制的主要目的是生成一个正整数序列,并且如果以这种方式使用,则AUTO_INCREMENT 列效果最好。所以应该定义AUTO_INCREMENT 列为U N S I G N E D。这样做的优点是在到达列类型的取值范围上限前可以进行两倍的序列编号。在某些环境下,也有可能利用AUTO_INCREMENT 列来生成负值的序列,但是我们不建议这样做。如果您决定要试一下,应该保证进行充分的试验,并且在升级到不同的MySQL版本时需要重新测试。笔者的经验表明,不同的版本中,负序列的性能并不完全一致。
    ■ 不要认为对某个列定义增加AUTO_INCREMENT 是一个得到无限的编号序列的奇妙方法。事实并非这样; AUTO_INCREMENT 序列受基础列类型的取值范围所限制。例如,如果使用TINYINT UNSIGNED 列,则最大的序列号为2 5 5。在达到这个界限时,应用程序将开始出现“重复键”错误。
    ■ MySQL3.23 引入了不重用序列编号的新AUTO_INCREMENT 性能,并且允许在CREATE TABLE 语句中指定一个初始的序列编号。这些性能在使用下列形式的DELETE 语句删除了表中所有记录后可以撤消:

    在此情形下,序列重新从1开始而不按严格的增量顺序继续增加。即使在C R E AT ETABLE 语句中明确指定了一个初始的序列编号,相应的序列也会从头开始。出现这种情形的原因在于MySQL优化完全删空一个表的DELETE 语句的方法上;它从头开始重新创建数据文件和索引文件而不是去删除每个记录,这样就丢失了所有的序列号信息。如果要删除所有记录,但希望保留序列信息,可以取消优化并强制MySQL执行逐行的删除操作,如下所示:

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

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

    这个步骤虽然是附加的,但不会花费太多的时间,因为没有WHERE 子句的SELECT COUNT(*) 是优化的,返回很快。如果表是空的,则插入记录并明确地对序列编号列指定值10 0。如果表不空,则对序列编号列值指定NULL 使MySQL自动生成下一个编号。此方法允许插入序列编号为10 0、101等的记录,它不管MySQL是否允许指定初始序列值都能正常工作。如果要求序列编号即使是从表中删除了记录后也要严格递增,则此方法不起作用。在这样的情形下,可将此方法与前面描述的什么也不做只是用来产生用于主表的序列编号的辅助表技术结合使用。为什么会希望从一个大于1的序列编号开始呢?一个原因是想使所有序列编号全都具有相同的数字位数。如果需要生成顾客ID 号,并且希望不要多于一百万个顾客,则可以从1000 000
开始编号。在对顾客ID 值计数的数字位数改变之前,可以追加一百万个顾客。当然,强制序列编号为一个固定宽度的另一个方法是采用ZEROFILL 列。对于有的情形,这样做有可能会出问题。例如,如果在Perl 或PHP 脚本中处理具有前导零的序列编号,则必须仔细地将它们只作为串使用;如果将它们转换成数字,前导零将会丢失。下面的短Perl 脚本说明了处理编号时可能会出的问题:

    打印时,此脚本给出下列输出:

    Perl’s‘+ +’自动增量操作是很灵巧的而且可以利用串或数值建立序列值,但‘+ =’操作只应用于数值。在所显示的输出中,可看到‘ + =’引起串到数值的转换并且丢失了$s 值中的前导零。
    序列不从1开始的另一个原因从技术的角度来说可能不值一提。例如,在分配会员号时,序列号不要从1开始,以免出现关于谁是第一号的政治争论。
    (4) 不用AUTO_INCREMENT 生成序列生成序列号的另一个方法根本就不需要使用AUTO_INCREMENT 列。它利用取一个参数的L A S T _ INSERT_ID( ) 函数的变量来生成序列号。(这种形式在MySQL3.22.9. 中引入)如果利用L A S T _ INSERT_ID(expr) 来插入或更新一个列, 则下一次不用参数调用L A S T _ INSERT_ID( ) 时,将返回expr 的值。换句话说,就像由AUTO_INCREMENT 机制生成的那样对expr 进行处理。这样使得能生成一个序列号,然后可在以后的客户会话中利用它,用不着取受其他客户机影响的值。利用这种策略的一种方法是创建一个包含一个值的单行表,该值在想得到序列中下一个值时进行更新。例如,可创建如下的表:

    上面的语句创建了表seq_table 并用包含seq 值0 的行对其进行初始化。可利用这个表产生下一个序列号,如下所示:

    该语句取出seq 列的当前值并对其加1,产生序列中的下一个值。利用L A S T _ INSERT _ID(seq + 1) 生成新值使它就像一个AUTO_INCREMENT 值一样,而且此值可在以后的语句中通过调用无参数的L A S T _ INSERT_ID( ) 来取出。即使某个其他客户机同时生成了另一个序列号,上述作用也不会改变,因为L A S T _ INSERT_ID( ) 是客户机专用的。如果希望生成增量不是1的编号序列或负增量的编号序列,也可以利用这个方法。例如,下面两个语句可以用来分别生成一个增量为100 的编号序列和一个负的编号序列:

    通过将seq 列设置为相应的初始值,可利用这个方法生成以任意值开始的序列。关于将此序列生成方法用于多个计数器的应用,可参阅第3章。
    2.2.3 串列类型
    MySQL提供了几种存放字符数据的串类型。串常常用于如下这样的值:

    在某种意义上,串实际是一种“通用”类型,因为可用它们来表示任意值。例如,可用串类型来存储二进制数据,如影像或声音,或者存储gzip 的输出结果,即存储压缩数据。对于所有串类型,都要剪裁过长的值使其适合于相应的串类型。但是串类型的取值范围很不同,有的取值范围很小,有的则很大。取值大的串类型能够存储近4GB 的数据。因此,应该使串足够长以免您的信息被切断(由于受客户机/服务器通信协议的最大块尺寸限制,列
值的最大限额为2 4 MB)。
    表2 - 8给出了MySQL定义串值列的类型,以及每种类型的最大尺寸和存储需求。对于可变长的列类型,各行的值所占的存储量是不同的,这取决于实际存放在列中的值的长度。这个长度在表中用L 表示。


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台