绝无经由的MySQL的AUTO_INCREMENT
这一切听起来不错,无疑DBaaS具有很多相对于RDBMS的优势。然而MySQL学习教程,DBaaS也有其局限性,云服务中固有的局限性就是之一。当客户开始将数据放入云端时,他们会遭遇到无法控制的网络性能问题。用法:CREATETABLEtest
(
idINTUNSIGNEDNOTNULLPRIMARYKEYAUTO_INCREMENT,
usernameVARCHAR(15)NOTNULL
)
AUTO_INCREMENT=100;
在数据库使用,我们常常要用到独一编号,以标识纪录。在MySQL中可经由过程数据列的AUTO_INCREMENT属性来主动天生。MySQL撑持多种数据表,每种数据表的自增属性都有差别,这里将先容各类数据内外的数据列自增属性。
ISAM表
假如把一个NULL拔出到一个AUTO_INCREMENT数据列里往,MySQL将主动天生下一个序列编号。编号从1入手下手,并1为基数递增。
把0拔出AUTO_INCREMENT数据列的效果与拔出NULL值一样。但不倡议如许做,仍是以拔出NULL值为好。
当拔出纪录时,没无为AUTO_INCREMENT明白指定值,则同等拔出NULL值。
当拔出纪录时,假如为AUTO_INCREMENT数据列明白指定了一个数值,则会呈现两种情形,情形一,假如拔出的值与已有的编号反复,则会呈现堕落信息,由于AUTO_INCREMENT数据列的值必需是独一的;情形二,假如拔出的值年夜于已编号的值,则会把该拔出到数据列中,并使鄙人一个编号将从这个新值入手下手递增。也就是说,能够跳过一些编号。
假如自增序列的最年夜值被删除,则在拔出新纪录时,该值被重用。
假如用UPDATE命令更新自增列,假如列值与已有的值反复,则会堕落。假如年夜于已有值,则下一个编号从该值入手下手递增。
假如用replace命令基于AUTO_INCREMENT数据列里的值来修正数据内外的现有纪录,即AUTO_INCREMENT数据列呈现在了replace命令的where子句里,响应的AUTO_INCREMENT值将不会产生变更。但假如replace命令是经由过程别的的PRIMARYKEYORUNIQUE索引来修正现有纪录的(即AUTO_INCREMENT数据列没有呈现在replace命令的where子句中),响应的AUTO_INCREMENT值--假如设置其为NULL(如没有对它赋值)的话--就会产生变更。
last_insert_id()函数可取得自增列主动天生的最初一个编号。但该函数只与服务器的本次会话过程当中天生的值有关。假如在与服务器的本次会话中还没有天生AUTO_INCREMENT值,则该函数前往0。
别的数据表的主动编号机制都以ISAM表中的机制为基本。
MyISAM数据表
删除最年夜编号的纪录后,该编号不成重用。
可在建表时可用“AUTO_INCREMENT=n”选项来指定一个自增的初始值。
可用altertabletable_nameAUTO_INCREMENT=n命令来重设自增的肇端值。
可以使用复合索引在统一个数据内外创立多个互相自力的自增序列,详细做法是如许的:为数据表创立一个由多个数据列构成的PRIMARYKEYORUNIQUE索引,并把AUTO_INCREMENT数据列包含在这个索引里作为它的最初一个数据列。如许,这个复合索引里,后面的那些数据列每组成一种举世无双的组合,最开端的AUTO_INCREMENT数据列就会天生一个与该组合绝对应的序列编号。
HEAP数据表
HEAP数据表从MySQL4.1入手下手才同意利用自增列。
自增值可经由过程CREATETABLE语句的AUTO_INCREMENT=n选项来设置。
可经由过程ALTERTABLE语句的AUTO_INCREMENT=n选项来修正自增始初值。
编号不成重用。
HEAP数据表不撑持在一个数据表中利用复合索引来天生多个互不搅扰的序列编号。
BDB数据表
不成经由过程CREATETABLEORALTERTABLE的AUTO_INCREMENT=n选项来改动自增初始值。
可重用编号。
撑持在一个数据内外利用复合索引来天生多个互不搅扰的序列编号。
InnDB数据表
不成经由过程CREATETABLEORALTERTABLE的AUTO_INCREMENT=n选项来改动自增初始值。
不成重用编号。
不撑持在一个数据内外利用复合索引来天生多个互不搅扰的序列编号。
在利用AUTO_INCREMENT时,应注重以下几点:
AUTO_INCREMENT是数据列的一种属性,只合用于整数范例数据列。
设置AUTO_INCREMENT属性的数据列应当是一个负数序列,以是应当把该数据列声明为UNSIGNED,如许序列的编号个可增添一倍。
AUTO_INCREMENT数据列必需有独一索引,以免序号反复。
AUTO_INCREMENT数据列必需具有NOTNULL属性。
AUTO_INCREMENT数据列序号的最年夜值受该列的数据范例束缚,如TINYINT数据列的最年夜编号是127,如加上UNSIGNED,则最年夜为255。一旦到达下限,AUTO_INCREMENT就会生效。
当举行全表删除时,AUTO_INCREMENT会从1从头入手下手编号。全表删除的意义是收回以下两条语句时:
deletefromtable_name;ortruncatetabletable_name
这是由于举行全表操纵时,MySQL实践是做了如许的优化操纵:先把数据内外的一切数据和索引删除,然后重修数据表。假如想删除一切的数据行又想保存序列编号信息,可如许用一个带where的delete命令以克制MySQL的优化:
deletefromtable_namewhere1;
这将迫使MySQL为每一个删除的数据行都做一次前提表达式的求值操纵。
强迫MySQL不复用已利用过的序列值的办法是:别的创立一个专门用来天生AUTO_INCREMENT序列的数据表,并做到永久不往删除该表的纪录。当必要在主数据内外拔出一笔记录时,先在谁人专学生成序号的表中拔出一个NULL值以发生一个编号,然后,在往主数据内外拔出数据时,使用LAST_INSERT_ID()函数获得这个编号,并把它赋值给主表的寄存序列的数据列。如:
insertintoidsetid=NULL;insertintomainsetmain_id=LAST_INSERT_ID();
可用alter命令给一个数据表增添一个具有AUTO_INCREMENT属性的数据列。MySQL会主动天生一切的编号。
要从头分列现有的序列编号,最复杂的办法是先删除该列,再重修该,MySQL会从头生一连的编号序列。
在不必AUTO_INCREMENT的情形下天生序列,可使用带参数的LAST_INSERT_ID()函数。假如用一个带参数的LAST_INSERT_ID(expr)往拔出或修正一个数据列,紧接着又挪用不带参数的LAST_INSERT_ID()函数,则第二次函数挪用前往的就是expr的值。上面演示该办法的详细操纵:
先创立一个只要一个数据行的数据表:createtableseq_table(idintunsignednotnull);insertintoseq_tablevalues(0);接着用以下操纵检索出序列号:updateseq_tablesetseq=LAST_INSERT_ID(seq+1);selectLAST_INSERT_ID();经由过程修正seq+1中的常数值,可天生分歧步长的序列,如seq+10可天生步长为10的序列。
该办法可用于计数器,在数据表中拔出多行以纪录分歧的计数值。再共同LAST_INSERT_ID()函数的前往值天生分歧内容的计数值。这类办法的长处是不必事件或LOCK,UNLOCK表便可天生独一的序列编号。不会影响别的客户程序的一般表操纵。
MySQL的双许可模式意味着,那些希望对数据库具有额外控制的人可以直接从数据库厂商那儿得到帮助。MySQLAB公司提供了支持和维护服务,诸如代码更新和补丁修补服务等,每年订阅费为大约3000美元。 可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。 这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。 如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。 原来公司用过MYSQL自己也只是建个表写个SQL 至于淘汰的问题,只能说在你的项目周期之内,微软应该都不会倒闭。 sqlserver的痛苦之处在于有用文档的匮乏,很多只是表明的东西 sqlserver的痛苦之处在于有用文档的匮乏,很多只是表明的东西 SQL语言是学习所有数据库产品的基础,无论你是做数据库管理还是做数据库开发都是这样。不过具体学习的侧重点要看你将来做哪一块,如果是做数据库管理(DBA),侧重点应该放在SQLServer的系统管理上.
页:
[1]