仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1071|回复: 9
打印 上一主题 下一主题

[学习教程] MYSQL网站制作之MySQL 4.1.0 中文参考手册 --- 6.5 数据...

[复制链接]
逍遥一派 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:45:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
要想在MySQL与其他数据库之间进行一个面面俱到的功能设置对比,并不是一件容易的MySQL学习教程。随着新软件版本的发布或一些补丁的推出。mysql|参考|参考手册|数据|中文MySQL4.1.0中文参考手册---犬犬(心帆)翻译MySQLReferenceManualforversion4.1.0-alpha.

6.5数据界说:CREATE、DROP、ALTER6.5.1CREATEDATABASE句法


CREATEDATABASE[IFNOTEXISTS]db_name

CREATEDATABASE以给命名字创立一个数据库。同意的数据库名划定规矩在章节6.1.2数据库、表、索引、列和别号中被给出。假如数据库已存在,而且你没有指定IFNOTEXISTS,这时候会发生一个毛病。

在MySQL中,数据库以包括数据库表对应文件的目次完成的。由于数据库在初始创立时没有表,以是CREATEDATABASE语句只在MySQL数据目次下创立一个目次。

你也能够利用mysqladmin创立一个数据库。检察章节4.8MySQL客户端剧本和有用程序。
6.5.2DROPDATABASE句法


DROPDATABASE[IFEXISTS]db_name

DROPDATABASE移除数据库是的一切表并删除数据库。假如你在一个标记链接(symboliclink)数据库上实行一个DROPDATABASE,链接与原始数据库均会被删除。要十分当心地利用这个命令!

DROPDATABASE前往从数据库目次下删除的文件数量。一般,它是表的数量的三倍,由于第张表一般对应于一个“.MYD”文件、一个“.MYI”文件和一个“.frm”文件。

DROPDATABASE命令从给定的数据库目次下移除以以下为扩大名的一切文件:
扩大名扩大名扩大名Ext.BAK.DAT.HSH.ISD.ISM.ISM.MRG.MYD.MYI.db.frm
一切包括两个数字的子目次(RAID目次)也一样被删除。

在MySQL3.22或今后的版本中,你可使用关头词IFEXISTS以避免假如数据库不存在时产生毛病。

你也能够利用mysqladmin移除数据库。检察章节4.8MySQL客户端剧本和有用程序。
6.5.3CREATETABLE句法


CREATE[TEMPORARY]TABLE[IFNOTEXISTS]tbl_name[(create_definition,...)][table_options][select_statement]orCREATE[TEMPORARY]TABLE[IFNOTEXISTS]tbl_nameLIKEold_table_name;create_definition:col_nametype[NOTNULL|NULL][DEFAULTdefault_value][AUTO_INCREMENT][PRIMARYKEY][reference_definition]orPRIMARYKEY(index_col_name,...)orKEY[index_name](index_col_name,...)orINDEX[index_name](index_col_name,...)orUNIQUE[INDEX][index_name](index_col_name,...)orFULLTEXT[INDEX][index_name](index_col_name,...)or[CONSTRAINTsymbol]FOREIGNKEY[index_name](index_col_name,...)[reference_definition]orCHECK(expr)type:TINYINT[(length)][UNSIGNED][ZEROFILL]orSMALLINT[(length)][UNSIGNED][ZEROFILL]orMEDIUMINT[(length)][UNSIGNED][ZEROFILL]orINT[(length)][UNSIGNED][ZEROFILL]orINTEGER[(length)][UNSIGNED][ZEROFILL]orBIGINT[(length)][UNSIGNED][ZEROFILL]orREAL[(length,decimals)][UNSIGNED][ZEROFILL]orDOUBLE[(length,decimals)][UNSIGNED][ZEROFILL]orFLOAT[(length,decimals)][UNSIGNED][ZEROFILL]orDECIMAL(length,decimals)[UNSIGNED][ZEROFILL]orNUMERIC(length,decimals)[UNSIGNED][ZEROFILL]orCHAR(length)[BINARY]orVARCHAR(length)[BINARY]orDATEorTIMEorTIMESTAMPorDATETIMEorTINYBLOBorBLOBorMEDIUMBLOBorLONGBLOBorTINYTEXTorTEXTorMEDIUMTEXTorLONGTEXTorENUM(value1,value2,value3,...)orSET(value1,value2,value3,...)index_col_name:col_name[(length)]reference_definition:REFERENCEStbl_name[(index_col_name,...)][MATCHFULL|MATCHPARTIAL][ONDELETEreference_option][ONUPDATEreference_option]reference_option:RESTRICT|CASCADE|SETNULL|NOACTION|SETDEFAULTtable_options:TYPE={BDB|HEAP|ISAM|InnoDB|MERGE|MRG_MYISAM|MYISAM}orAUTO_INCREMENT=#orAVG_ROW_LENGTH=#orCHECKSUM={0|1}orCOMMENT="string"orMAX_ROWS=#orMIN_ROWS=#orPACK_KEYS={0|1|DEFAULT}orPASSWORD="string"orDELAY_KEY_WRITE={0|1}orROW_FORMAT={default|dynamic|fixed|compressed}orRAID_TYPE={1|STRIPED|RAID0}RAID_CHUNKS=#RAID_CHUNKSIZE=#orUNION=(table_name,[table_name...])orINSERT_METHOD={NO|FIRST|LAST}orDATADIRECTORY="absolutepathtodirectory"orINDEXDIRECTORY="absolutepathtodirectory"select_statement:[IGNORE|REPLACE]SELECT...(Somelegalselectstatement)

CREATETABLE以给定的名字在以后数据库创立一个表。同意的表名划定规矩在章节6.1.2数据库、表、索引、列和别号中被给出。假如没有以后数据库或表已存在,一个毛病将会产生。

在MySQL3.22或今后的版本中,表名能够被指定为db_name.tbl_name。不论有无以后数据库,它也能一般事情。

从MySQL3.23入手下手,在创立一个表时,你可使用关头词TEMPORARY。它的名字被限止在以后毗连中,当毗连封闭时,一时表会主动地被删除。这就意味着,两个分歧的毗连可使用统一个一时表名而不会与另外一个抵触,也不会与同名现有的表相抵触(现有表将被埋没,只光临时表被删除)。从MySQL4.0.2入手下手,为了能创立一时表,你必需有CREATETEMPORARYTABLES权限。

在MySQL3.23或今后的版本中,你可使用关头词IFNOTEXISTS,因此假如表已存在,毛病也不会产生。注重,它其实不考证表布局是不是分歧。

在MySQL4.1中你可使用LIKE来基于一个表界说创立另外一个表。tocreateatablebasedonatabledefinitioninanothertable.InMySQL4.1中,你一样也能够为一个被天生的列指定范例:

CREATETABLEfoo(atinyintnotnull)SELECTb+1ASaFROMbar;

第张表tbl_name由数据库目次下的一些文件暗示。关于MyISAM范例的表,你将失掉:
文件用处tbl_name.frm表界说(form)文件tbl_name.MYD数据文件tbl_name.MYI索引文件
关于各类列范例的性子的更多信息,检察章节6.2列范例:
假如既没有指定NULL也没有指定NOTNULL,列被视为指定了NULL。

一个整型列能够有附加属性AUTO_INCREMENT。当你拔出一个NULL值(保举)或0到一个AUTO_INCREMENT列,该列将被设置到value+1,在这里,value是表中以后列的最年夜值。AUTO_INCREMENT序列以1入手下手。检察章节8.1.3.130mysql_insert_id()。假如你一个AUTO_INCREMENT列中包括最年夜值的行,关于ISAM或BDB表,该值会被从头利用,可是关于一个MyISAM或InnoDB表,却不会被重用。假如你以AUTOCOMMIT形式实行DELETEFROMtable_name(没有一个WHERE子句)删除表中的一切纪录行,关于一切的表序列均从头入手下手。注重:每一个表只能有一个AUTO_INCREMENT列,而且必需被索引。MySQL3.23一样也只事情于AUTO_INCREMENT列只撑持正值。拔出一个负值将被看成拔出一个很年夜的正值。这是为了不数字从正到负“包装”的精度成绩,也是为了确保不会心外埠失掉一个包括0的AUTO_INCREMENT列。在MyISAM和BDB表中,你能够指定AUTO_INCREMENT多列索引中的第二个列。检察章节3.5.9利用AUTO_INCREMENT.为了使MySQL兼容某些ODBC使用程序,你能够用以下查询找出最初被拔出的纪录行:
SELECT*FROMtbl_nameWHEREauto_colISNULL
假如MySQL二进制日记被利用,CREATETABLE将主动地提交以后InnoDB事件。

NULL值关于TIMESTAMP列的处置分歧于别的的列范例。你不克不及在一个TIMESTAMP列中存储一个笔墨NULL;将列设置为NULL将设置它为以后的日期和工夫。由于TIMESTAMP列的举动就是如许,列的NULL和NOTNULL属性不以常态体例影响它,假如你指定它们,将被疏忽。另外一方面,为了使MySQL客户端更简单地利用TIMESTAMP列,服务器呈报如许的列被赋值为NULL值(这是真的),即便TIMESTAMP实践上决不会包括一个NULL值。当你利用DESCRIBEtbl_name失掉有关你的表的形貌时,你就会分明这点。注重,设置一个TIMESTAMP列为0不同等于设置它为NULL,由于0是一个无效的TIMESTAMP值。

DEFAULT值必需是一个常量,不成所以一个函数或一个表达式。假如一个列没有指定DEFAULT值,MySQL将主动地赋于一个,划定规矩以下:假如列能够承受NULL作为一个值,缺省值为NULL。假如列被界说为NOTNULL,缺省值取决于列的范例:关于没有声明AUTO_INCREMENT属性的数字范例,缺省值为0。关于一个AUTO_INCREMENT列,缺省值为序列中的下一个值。

关于非TIMESTAMP的日期和工夫范例,缺省值是该范例得当的零值。关于表中的第一个TIMESTAMP列,缺省值为以后的日期和工夫。检察章节6.2.2Date和Time范例。

关于非ENUM的字符串范例,缺省值是空字符串。关于ENUM,缺省值为第一个列举值。

缺省值必需是常量。这意味着,比方,关于一个日期列,你不克不及将一个像NOW()或CURRENT_DATE的函数设置为缺省值。

KEY是INDEX的同义词。

在MySQL中,一个UNIQUE键只能有分歧的值。假如你试图以婚配一个现有行的键增加新行,将发生一个毛病。

PRIMARYKEY是一个独一KEY,它另有一个分外的束缚,一切键列必需被界说为NOTNULL。在MySQL中,该被定名为PRIMARY。一张表只能有一个PRIMARYKEY。假如在你的表中没有一个PRIMARYKEY,而某些使用程序请求PRIMARYKEY,MySQL将前往第一个没有任何NULL列的UNIQUE键,做为PRIMARYKEY。

一个PRIMARYKEY能够是一个多列索引。但是,你不克不及在一个列规格申明中利用PRIMARYKEY键属性来创立一个多列索引。如许做将仅仅标志单个列做为主键。你必需利用PRIMARYKEY(index_col_name,...)句法。

假如PRIMARY或UNIQUE键只由一个列构成,而且列范例是整型,你能够用_rowid援用它。(在版本3.23.11中新到场)。

假如你不为一个索引指派一个名字,索引名将被指派为与第一个index_col_name不异的名字,以一个可选后缀(_2,_3,...)使它独一。利用SHOWINDEXFROMtbl_name能够从一个表中检察索引名。检察章节4.5.6.1检索有关数据库、表、列和索引的信息。

只要MyISAM、InnoDB和BDB表范例撑持在能够有NULL值的列上索引。在别的情形下,你必需声明这个列为NOTNULL大概失掉一个毛病了局。

利用col_name(length)句法,你能够一个索引只利用一个CHAR或VARCHAR列的一部分。这可使索引文件更小一点。检察章节5.4.4列索引。

只要MyISAM表范例活动在BLOB和TEXT列上索引。当在一个BLOB或TEXT列上安排一个索引时,你必需老是指定索引的长度:
CREATETABLEtest(blob_colBLOB,INDEX(blob_col(10)));
当你对一个TEXT或BLOB列利用ORDERBY或GROUPBY时,只要最后面的max_sort_length字节被利用。检察章节6.2.3.2BLOB和TEXT范例。

在MySQL3.23.23或更新的版本中,你也能够创立特别的FULLTEXT索引。他们被用于全文搜刮。只要MyISAM表范例撑持FULLTEXT索引。他只能从CHAR、VARCHAR和TEXT列创建。索引老是创建在全部列上;部分索引是不撑持的。具体操纵请检察章节6.8MySQL全文搜刮。

在MySQL3.23.44或更新的版本中,InnoDB表撑持外键束缚反省。检察章节7.5InnoDB表。注重,InnoDB中的FOREIGNKEY句法比下面先容的句法有更多的限定。InnoDB不同意index_name被指定,参考表的列老是必需明白定名。从4.0.8入手下手,InnoDB在外键上撑持ONDELETE和ONUPDATE举措。准确句法检察InnoDB手册章节。检察章节7.5InnoDB表。关于别的的表范例,MySQL服务器对CREATETABLE命令中的FOREIGNKEY、CHECK和REFERENCES句法作语法剖析,可是没有更进一步的举动。检察章节1.8.4.5外键。

每一个NULL列占有分外的一个比特,弃取到最靠近的字节。

最年夜纪录的字节长度能够按上面的盘算得出:
rowlength=1+(sumofcolumnlengths)+(numberofNULLcolumns+7)/8+(numberofvariable-lengthcolumns)
table_options和SELECT选项只在MySQL3.23和今后的版本中被完成。分歧的表范例为:

表范例寄义BDB或BerkeleyDB以页锁定的事件平安型表。检察章节7.6BDB或BerkeleyDB表HEAP这个表的数据只寄存在内存中。检察章节7.4HEAP表ISAM最后的存储引擎。检察章节7.3ISAM表InnoDB以行锁定的事件平安型表。检察章节7.5InnoDB表MERGE做为一个表利用的MyISAM表的搜集品。检察章节7.2MERGE表MRG_MyISAMMERGE表的别号MyISAM用于取代ISAM的新的笨重型二进制存储引擎。检察章节7.1MyISAM表

检察章节7MySQL表范例。假如一个表范例被指定,而谁人特别范例是不成用的,MySQL将选择最靠近于你所指定范例的表范例。比方,假如TYPE=BDB被指定,而以后版本的MySQL不撑持BDB表,该将会做为MyISAM表取代被创立。别的的表选项是用于优化表举动的。在年夜多半情形下,你不用指定他们中的任何一个。选项对一切表均合用,假如不合用则别的申明:

选项寄义AUTO_INCREMENT你想要为你的表设定的下一个AUTO_INCREMENT值。(MyISAM)AVG_ROW_LENGTH你的表的均匀行长度的近似值。你只需为有变长纪录的年夜表设置它CHECKSUM假如你但愿MySQL对一切的纪录行保持一个查验和(这将使表在更新时变得更慢,可是使得更简单地发明破坏的表),设置它为1。(MyISAM)COMMENT关于你的表的一个60个字符的正文MAX_ROWS你企图在表中存储的最年夜纪录行数量MIN_ROWS你企图在表中存储的最小纪录行数量PACK_KEYS假如你但愿有更小的索引,设置它为1。这一般使的更新加倍得慢,面读取列快(MyISAM,ISAM)。设置它为0,将禁用一切键紧缩。设置它为DEFAULT(MySQL4.0),将告知存储引擎仅仅紧缩长的CHAR/VARCHAR列PASSWORD以一个暗码加密`.frm文件。在MySQL尺度版中,这个选项不做任何事DELAY_KEY_WRITE假如但愿提早键表更新,直到该表被封闭,设置它为1。(MyISAM).ROW_FORMAT界说纪录行怎样被存储。今朝,这个选项只能事情于MyISAM表,它撑持DYNAMIC和FIXED行格局。检察章节7.1.2MyISAM表格局

当你利用一个MyISAM表时,MySQL利用max_rows*avg_row_length的乘积来终极表将有多年夜。假如你不指定下面的任何选项,一个表的最年夜平易近族教导将是4G(或2G,假如你的操纵体系仅撑持2G的最年夜文件)。缘故原由是仅仅是为了把持指针局限使索引更小和更快,假如您真的不必要年夜文件。假如你不利用PACK_KEYS,缺省仅仅紧缩字符串,不紧缩数字。假如你利用PACK_KEYS=1,数字也将被很好地紧缩。当紧缩二进制数字键时,MySQL将利用prefix紧缩。这就意味着,假如有很多一样的数字,你才干失掉很年夜的好处。Prefix紧缩意味着每一个键都必要一个分外的字节来唆使前一个键有几字节与下一个键不异(注重,行指针被以高元组第一序次(high-byte-first-order)间接地存储在键后,以改良紧缩)。这就意味着,假如在一个纪录行上有一连两行的相称键,上面一切“不异”的键一般只占用2个字节(包含纪录行指针)。与一般情形下比拟,上面的“不异”键将占用storage_size_for_key+pointer_size(一般4)个字节。另外一方面,假如一切的键都是分歧的,你将在每一个键上丧失1字节,假如该键不是一个能够有NULL值的键。(在这类情形下,紧缩后键的长度将存储在用于键是不是为NULL的位元组中。)

假如你在一个CREATE语句中指定一个SELECT,MySQL为SELECT中的一切元素创立新的字段。比方:
mysql>CREATETABLEtest(aINTNOTNULLAUTO_INCREMENT,->PRIMARYKEY(a),KEY(b))->TYPE=MyISAMSELECTb,cFROMtest2;
这将创立一个有三个列的MyISAM表,a、b和c。请注重,SELECT语句中的列被增加到表的右侧,而不是堆叠在下面。看上面的例子:
mysql>SELECT*FROMfoo;+---+|n|+---+|1|+---+mysql>CREATETABLEbar(mINT)SELECTnFROMfoo;QueryOK,1rowaffected(0.02sec)Records:1Duplicates:0Warnings:0mysql>SELECT*FROMbar;+------+---+|m|n|+------+---+|NULL|1|+------+---+1rowinset(0.00sec)
关于表foo中每一个纪录行,一个以从表foo来的值和新列的缺省值构成的纪录行被拔出到表bar中。CREATETABLE...SELECT不会为了主动地创立索引。这是存心如许做的,是为了该命令尽量地天真。假如你但愿在创立表时同时创立索引,你必需在SELECT语句之前指定它们:
mysql>CREATETABLEbar(UNIQUE(n))SELECTnFROMfoo;
假如在拷贝数据到表中时产生任何毛病,数据将被主动地删除。为了确保更新日记/二进制日记可用于重修最后的表,在CREATETABLE...SELECT过程当中,MySQL不同意并发的拔出。

在不撑持年夜文件的操纵体系上,RAID_TYPE选项能够匡助你冲破MyISAM数据文件(非索引文件)的2G/4G限止。注重,这个选项在撑持年夜文件的文件体系上不保举利用!将RAID目次放在分歧的物理磁盘上,能够经由过程I/O瓶颈失掉更高的速率。RAID_TYPE能够在任何操纵体系上事情,只需你设置MySQL--with-raid。今朝RAID_TYPE只同意STRIPED(1和RAID0是它的别号)。假如你对一个MyISAM表指定RAID_TYPE=STRIPED,MyISAM将在数据库目次下创立RAID_CHUNKS子目次,并定名为00,01,02。在每一个目次中,MyISAM将创立一个table_name.MYD。当将数据写进数据文件中时,RAID处置器将映照第一个RAID_CHUNKSIZE*1024字节到第一个文件中,下一个RAID_CHUNKSIZE*1024字节到下一个文件中,等等。

UNION被用于当你但愿将多个一样的表搜集为一个时。它仅仅与MERGE表一同共同利用。检察章节7.2MERGE表。今朝,在你将几个表映照为一个MERGE表时,你必要有对这些表的SELECT、UPDATE和DELETE权限。一切被映照的表必需与MERGE表在统一个数据库中。

假如你但愿向一个MERGE表中拔出数据,你不能不用INSERT_METHOD指定纪录行拔出到哪个表中。检察章节7.2MERGE表。这个选项在MySQL4.0.0中被引进。

在创立表时,PRIMARY键必需放在第一名,然后是一切UNIQUE键,再后是一般键。这能够匡助MySQL优化程序辨别哪一个键优先利用,同时更快地检测出反复的UNIQUE键。

经由过程利用DATADIRECTORY="directory"或INDEXDIRECTORY="directory",你能够指定存储引擎在甚么中央寄存它的表和索引文件。注重,目次必需以一个完全路径指定(不是绝对路径)。这仅仅事情于MySQL4.0中的MyISAM表,而且你没有利用--skip-symlink选项。检察章节5.6.1.2对表利用标记链接。6.5.3.1隐式的列界说变更


在某些情形下,MySQL隐式地改动一个在CREATETABLE给定的列的规约。(这在ALTERTABLE中也大概产生。):
长度不凌驾四个字节的VARCHAR列被改动为CHAR。

假如在一个表中有任何一个列是变长的,则了局是全部纪录行也是变长的。因而,假如一个表中包括任何变长的列(VARCHAR、TEXT或BLOB),一切善于3个字符的CHAR列将被改动为VARCHAR列。这在任何方面都不影响你怎样利用该列;在MySQL中,VARCHAR只是存储字符的另外一个分歧的办法。MySQL实行这个转换,是由于它节俭空间,而且使表操纵更快。检察章节7MySQL表范例。

TIMESTAMP的显现尺寸必需是在2到14局限以内的偶数。假如指定显现尺寸为0或凌驾14,尺寸被强迫设为14。从1到13局限内的奇数值尺寸将被强迫为下一个更年夜的偶数。

你不克不及在一个TIMESTAMP列中存储一个笔墨NULL;将一个NULL值赋给它将设置它为以后的日期和工夫。由于TIMESTAMP列的举动就是如许,列的NULL和NOTNULL属性不以常态体例影响它,假如你指定它,将被疏忽。DESCRIBEtbl_name老是呈报一个TIMESTAMP列被赋于了NULL值。

MySQL将别的SQL数据库供给商利用的列范例映照到MySQL范例。检察章节6.2.5利用来自别的的数据库引擎的列范例。
假如你但愿晓得在你创立或改动了你的表后,MySQL是不是利用了分歧于你所指定的列范例,你能够收回一个DESCRIBEtbl_name语句。

假如你利用myisampack紧缩一个表,别的的某些列范例大概会产生改动。检察章节7.1.2.3紧缩表的特性。
6.5.4ALTERTABLE句法


ALTER[IGNORE]TABLEtbl_namealter_spec[,alter_spec...]alter_specification:ADD[COLUMN]create_definition[FIRST|AFTERcolumn_name]orADD[COLUMN](create_definition,create_definition,...)orADDINDEX[index_name](index_col_name,...)orADDPRIMARYKEY(index_col_name,...)orADDUNIQUE[index_name](index_col_name,...)orADDFULLTEXT[index_name](index_col_name,...)orADD[CONSTRAINTsymbol]FOREIGNKEY[index_name](index_col_name,...)[reference_definition]orALTER[COLUMN]col_name{SETDEFAULTliteral|DROPDEFAULT}orCHANGE[COLUMN]old_col_namecreate_definition[FIRST|AFTERcolumn_name]orMODIFY[COLUMN]create_definition[FIRST|AFTERcolumn_name]orDROP[COLUMN]col_nameorDROPPRIMARYKEYorDROPINDEXindex_nameorDISABLEKEYSorENABLEKEYSorRENAME[TO]new_tbl_nameorORDERBYcolortable_options

ALTERTABLE同意你改动一个现有表的布局。比方,你能够增加或删除列,创立或打消索引,变动现有列的范例或将列或表本身改名。你也能够改动表的正文和表的范例。检察章节6.5.3CREATETABLE句法。

假如你利用ALTERTABLE来改动一个列规约,可是DESCRIBEtbl_name显现你的列并没有被修正,这有多是由于章节6.5.3.1隐式的列界说变更形貌的一个缘故原由,使MySQL疏忽了你的修正。比方,假如你实验将一个VARCHAR列变动为CHAR,而假如在这个表中包括别的的变长列,MySQL将仍旧利用VARCHAR。

ALTERTABLE经由过程创建原初表的一个一时正本来事情。变动在正本上实行,然后原初表将被删除,一时表被换名。如许做使一切的修正主动地转向到没有任何更新失利的新表。当ALTERTABLE实行时,原初表可被别的客户端读取。更新与写进被提早到新的表筹办好。

注重,假如你以除RENAME以外的别的选项利用ALTERTABLE,MySQL将老是创立一个一时表,即便数据其实不的确必要被复制(就像当你改动一个列名时)。我们企图不久来修改它,可是一般人们是不常常实行ALTERTABLE的,以是在我们的TODO上,这个修改并非急于处置的。关于MyISAM表,你能够将变量myisam_sort_buffer_size设置和高一点,以减速索引的重修部分(这是重修历程中最慢的部分)。
为了利用ALTERTABLE,你必要在这个表上有ALTER、INSERT和CREATE权限。

IGNORE是MySQL对ANSISQL92的扩大。它用于把持当在新表中的独一键上呈现反复值时,ALTERTABLE怎样事情。假如IGNORE没有被指定,正本将被保持并回退。假如IGNORE被指定,那末在独一键上反复的纪录行只要第一个纪录行被利用;别的的均被删除。

你能够在单个的ALTERTABLE语句中收回多个ADD、ALTER、DROP和CHANGE子句。这是MySQL对ANSISQL92的扩大,ANSISQL92只同意在每一个ALTERTABLE语句中一个子句。

CHANGEcol_name、DROPcol_name和DROPINDEX是MySQL对ANSISQL92的扩大。

MODIFYisanOracleextensiontoALTERTABLE.可选词COLUMN只是一个无用词组,可被疏忽。

假如你利用ALTERTABLEtbl_nameRENAMETOnew_name,并没有任何别的的选项,MySQL将复杂地重定名与表tbl_name的文件。这不必要创立一时表。检察章节6.5.5RENAMETABLE句法。

create_definition子句利用与CREATETABLE不异的ADD和CHANGE句法。注重,这些句法不但包括列范例,还要包括列名。检察章节6.5.3CREATETABLE句法。

你可使用一个CHANGEold_col_namecreate_definition子句来重定名一个列。为了如许做,你必需指定旧的和新的列名,和列以后的范例。比方,为了将一个INTEGER列a重定名为b,你必需如许做:
mysql>ALTERTABLEt1CHANGEabINTEGER;
假如你但愿改动一个列的范例而不是列名,CHANGE句法仍旧必要有两个列名,即便它们是一样的。比方:
mysql>ALTERTABLEt1CHANGEbbBIGINTNOTNULL;
然后,到MySQL3.22.16a时,你也能够利用MODIFY来改动一个列的范例而不必要重定名它:
mysql>ALTERTABLEt1MODIFYbBIGINTNOTNULL;
假如你利用CHANGE或MODIFY延长一个列,而该列上存在一个取列部分值的索引(举例来讲,假如你有一个索引在一个VARCHAR列的前10个字符上),那末,你将不克不及使列短于索引的字符数量。

当你利用CHANGE或MODIFY改动一个列范例时,MySQL将实验尽量地将数据转换到新的范例。

在MySQL3.22或更新的版本中,你可使用FIRST或ADD...AFTERcol_name在一个表中的某个特定地位增加一列。缺省是增添到最初一列。从MySQL4.0.1入手下手,你也能够在CHANGE或MODIFY中利用关头词FIRST和AFTER。

ALTERCOLUMN能够为一列指定一个新的缺省值或删除老的缺省值。假如老的缺省值被移除且列能够被设为NULL,新的缺省值将是NULL。假如该列不同意有NULL值,MySQL以章节6.5.3CREATETABLE句法中的形貌体例为该列赋于一个缺省值。

DROPINDEX移除一个索引。这是MySQL对ANSISQL92的一个扩大。检察章节6.5.8DROPINDEX句法。

假如列被从一个表中移除,列也将从任何有它为构成部分的索引中被移除。假如构成一个索引的一切列均被移除,那末,该索引也将被移除。

假如一个表只包括一个列,那末该列不克不及被移除。假如你本就盘算移除该表,请利用DROPTABLE取代。

DROPPRIMARYKEY移除主索引。假如如许的索引不存在,它将移除表中的第一个UNIQUE索引。(假如没有PRIMARYKEY被明白指定,MySQL将第一个UNIQUE键标志为PRIMARYKEY)假如你增加一个UNIQUEINDEX或PRIMARYKEY到一个表中,它将被存储在任何非UNIQUE索引之前,因此,MySQL能够尽量地检测出反复键。

ORDERBY同意你以指定的纪录行按次创立一个新表。注重,在拔出与删除后,该表将不会保存这个按次。在某些情形下,假如表在你今后但愿排序的列上是有序的,这将使得MySQL排序时加倍得简单。当你晓得你次要查询的行以一个断定的序次时,这将是很有效的。在对表举行过年夜的改动后,经由过程利用这个选项,你大概会失掉更高的功能。

假如你在一个MyISAM表上利用ALTERTABLE,一切非独一的索引将以一个分批体例创立(就像REPAIR一样)。当你有良多索引时,这大概使ALTERTABLE更快一点。

从MySQL4.0入手下手,下面的特征可明白地激活。ALTERTABLE...DISABLEKEYS使MySQL中断更新MyISAM表的非独一索引。然后ALTERTABLE...ENABLEKEYS能够被用来重修丧失的索引。由于MySQL以特别的算法实行它,这将比一个接一个地拔出索引要快很多,禁用键能够很年夜程序上的减速一个多量量的拔出。

利用CAPI函数mysql_info(),你能够找出有几纪录被拷贝,和(当IGNORE被利用时)有几纪录因独一键值反复而被删除。

FOREIGNKEY、CHECK和REFERENCES子句实践上不做任何事变,除关于InnoDB范例的表,它撑持ADDCONSTRAINTFOREIGNKEY(...)REFERENCES...(...)。注重,InnoDB不同意一个index_name被指定。检察章节7.5InnoDB表。关于别的范例的表,这个句法仅仅为了兼容而供应,以更简单地从别的SQL服务器移植代码和更简单地运转以援用创立表的使用程序。检察章节1.8.4MySQL与ANSISQL92比拟分歧的不同。
这里是一个例子,显现了ALTERTABLE的一些用法。我们以一个按以下体例创立一个表t1入手下手:

mysql>CREATETABLEt1(aINTEGER,bCHAR(10));

为了将表t1重定名为t2:

mysql>ALTERTABLEt1RENAMEt2;

为了将列a从INTEGER改动为TINYINTNOTNULL(列名稳定),并将列b从CHAR(10)改动为CHAR(20),同时也将b重定名为c:

mysql>ALTERTABLEt2MODIFYaTINYINTNOTNULL,CHANGEbcCHAR(20);

增加一个名为d的TIMESTAMPc列:

mysql>ALTERTABLEt2ADDdTIMESTAMP;

在列d上增添一个索引,将列a设为主键:

mysql>ALTERTABLEt2ADDINDEX(d),ADDPRIMARYKEY(a);

移除列c:

mysql>ALTERTABLEt2DROPCOLUMNc;

增加一个名为c的AUTO_INCREMENT整型列:

mysql>ALTERTABLEt2ADDcINTUNSIGNEDNOTNULLAUTO_INCREMENT,ADDINDEX(c);

注重,我们索引了c,由于AUTO_INCREMENT列必需被索引,一样我们声明列c为NOTNULL,由于被索引的列不克不及有NULL。

当你增加一个AUTO_INCREMENT列时,列值会主动地以序列值添补。经由过程在ALTERTABLE或利用AUTO_INCREMENT=#表选项之前实行SETINSERT_ID=#,你能够设置第一个序列数字。检察章节5.5.6SET句法。

关于MyISAM表,假如你不改动AUTO_INCREMENT列,序列值将不会被影响。假如你移除一个AUTO_INCREMENT列,并增加另外一个AUTO_INCREMENT列,值将再次从1入手下手。

检察章节A.6.1ALTERTABLE的成绩。
6.5.5RENAMETABLE句法


RENAMETABLEtbl_nameTOnew_tbl_name[,tbl_name2TOnew_tbl_name2,...]

改名是以原子体例(atomically)实行,这就意味着,当改名正在运转时,别的的任何线程均不克不及该表。这使得以一个空表交换一个表成为大概。

CREATETABLEnew_table(...);RENAMETABLEold_tableTObackup_table,new_tableTOold_table;

更名是从左到右实行的,这就意味着,假如你但愿互换两个表名,你不能不如许做:

RENAMETABLEold_tableTObackup_table,new_tableTOold_table,backup_tableTOnew_table;

只需两个数据库在统一个磁盘上,你也能够从一个数据库改名到另外一个数据库:

RENAMETABLEcurrent_db.tbl_nameTOother_db.tbl_name;

当你实行RENAME时,你不克不及有任何锁定的表或举动的事件。你一样也必需有对原初表的ALTER和DROP权限,和对新表的CREATE和INSERT权限。

假如在多表改名中,MySQL遭受就任何毛病,它将对一切被改名的表举行发展改名,将每件事物退回到最后形态。

RENAMETABLE在MySQL3.23.23中被到场。
6.5.6DROPTABLE句法


DROP[TEMPORARY]TABLE[IFEXISTS]tbl_name[,tbl_name,...][RESTRICT|CASCADE]

DROPTABLE移除一个或多个表。一切的数据和表界说均被移除,以是,必定要当心地利用这个命令!

在MySQL3.22或更新的版本中,你可使用关头词IFEXISTS避免表不存在时产生毛病。在4.1中,当利用IFEXISTS时,关于一切不存在的表,你将失掉一个NOTE。检察章节4.5.6.9SHOWWARNINGS|ERRORS。

RESTRICTandCASCADE被同意是为了更简单的移植。今朝,他们不起任何感化。

注重:DROPTABLE将主动地提交以后举动的事件(除非你利用的是MySQL4.1,而且利用了TEMPORARY关头词)。

选项TEMPORARY在4.0中被疏忽。在4.1中,此人选项按以下所示事情:
只移除一时表。不停止一个运转着的事件。不会被反省会见权限。
利用TEMPORARY是一个很好的平安体例,它能够避免你不测地移除一个实在的表。
6.5.7CREATEINDEX句法




CREATE[UNIQUE|FULLTEXT]INDEXindex_nameONtbl_name(col_name[(length)],...)

CREATEINDEX句法在MySQL3.22之前的版本中不做任何事变。在3.22或今后的版本中,CREATEINDEX被映照到一个ALTERTABLE语句来创立索引。检察章节6.5.4ALTERTABLE句法。

一般,在用CREATETABLE创立表自己时你就创立表的一切索引。检察章节6.5.3CREATETABLE句法。CREATEINDEX同意你在一个现有表上增加索引。

(col1,col2,...)格局的列列表创立一个多列索引。索引值由给定的列值毗连而成。

关于CHAR和VARCHAR列,利用col_name(length)句法,能够只用一个列的部分来创立索引。(关于BLOB和TEXT列,长度是必需的。)这里的语句显现利用name列的前10个字符创立一个索引:

mysql>CREATEINDEXpart_of_nameONcustomer(name(10));

由于,年夜多半名字一般在前10个字符是纷歧样的,这个索引不该该比以全部name创立的索引慢。一样,利用部排列值创立的索引文件会更小一点,这将节俭良多磁盘空间,也能够减速INSERT操纵!

注重,假如你存在利用的是MySQL3.23.2或更新的版本而且是MyISAM表范例,这时候你才干在一个能够有NULL值的列上创立索引,和在一个BLOB/TEXT列上创立索引。

关于MySQL怎样利用索引的更多信息,检察章节5.4.3MySQL怎样利用索引。

FULLTEXT索引只能索引VARCHAR和TEXT列,并且只能使用于MyISAM表。FULLTEXT索引在MySQL3.23.23和更新的版本中可使用。检察章节6.8MySQL全文搜刮。
6.5.8DROPINDEX句法


DROPINDEXindex_nameONtbl_name

DROPINDEX从表tbl_name移除一个名为index_name的索引。在MySQL3.22先前的版本中不做任何事变。在3.22或今后的版本中,DROPINDEX被映照到一个ALTERTABLE语句来移除索引。检察章节6.5.4ALTERTABLE句法。
越来越多的开发者将继续选择MySQL。Evans的总裁JohnAndrews表示,MySQL学习教程用户对MySQL和其他开源数据库的评价正在赶上甚至超过很多专有商业数据库软件。
飘飘悠悠 该用户已被删除
沙发
发表于 2015-1-19 22:28:10 | 只看该作者
是否碎片会引发效率问题?这都是需要进一步探讨的东西。varbinary(max)代替image也让SQLServer的字段类型更加简洁统一。
飘灵儿 该用户已被删除
板凳
发表于 2015-1-28 14:08:44 | 只看该作者
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
柔情似水 该用户已被删除
地板
发表于 2015-2-5 21:44:50 | 只看该作者
连做梦都在想页面结构是怎么样的,绝非虚言
活着的死人 该用户已被删除
5#
发表于 2015-2-13 17:48:52 | 只看该作者
至于淘汰的问题,只能说在你的项目周期之内,微软应该都不会倒闭。
admin 该用户已被删除
6#
发表于 2015-3-4 01:04:48 | 只看该作者
外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。
精灵巫婆 该用户已被删除
7#
发表于 2015-3-11 15:05:43 | 只看该作者
个人感觉没有case直观。而且默认的第三字段(还可能更多)作为groupby字段很容易造成新手的错误。
乐观 该用户已被删除
8#
发表于 2015-3-19 00:50:04 | 只看该作者
习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQLServerManagementStudio的朋友使用。
深爱那片海 该用户已被删除
9#
发表于 2015-3-27 00:08:16 | 只看该作者
原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜!
若天明 该用户已被删除
10#
发表于 2015-3-27 00:08:16 | 只看该作者
分区表效率问题肯定是大家关心的问题。在我的试验中,如果按照分区字段进行的查询(过滤)效率会高于未分区表的相同语句。但是如果按照非分区字段进行查询,效率会低于未分区表的相同语句。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 20:34

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表