|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
WindowsAzureSQLDatabase并不支持数据压缩和表分区之类的功能,而且SQLDatabase支持的Transact-SQL语言只是完整版的一部分。另外,因为解决方案提供商不能控制物理资源,所以他们不能将数据文件和索引分配给特定的硬件。mysql|select|参考|参考手册|数据|中文MySQL4.1.0中文参考手册---犬犬(心帆)翻译MySQLReferenceManualforversion4.1.0-alpha.
6.4数据利用:SELECT,INSERT,UPDATE,DELETE6.4.1SELECT句法
SELECT[STRAIGHT_JOIN][SQL_SMALL_RESULT][SQL_BIG_RESULT][SQL_BUFFER_RESULT][SQL_CACHE|SQL_NO_CACHE][SQL_CALC_FOUND_ROWS][HIGH_PRIORITY][DISTINCT|DISTINCTROW|ALL]select_expression,...[INTO{OUTFILE|DUMPFILE}file_nameexport_options][FROMtable_references[WHEREwhere_definition][GROUPBY{unsigned_integer|col_name|formula}[ASC|DESC],...][HAVINGwhere_definition][ORDERBY{unsigned_integer|col_name|formula}[ASC|DESC],...][LIMIT[offset,]rows|rowsOFFSEToffset][PROCEDUREprocedure_name(argument_list)][FORUPDATE|LOCKINSHAREMODE]]
SELECT用于检索从一个或多个表当选掏出的行。select_expression暗示你但愿检索的列。SELECT也能够被用于检索没有援用任何表的盘算列。比方:
mysql>SELECT1+1;->2
一切利用的关头词必需严厉以下面所显现的序次被给出。举例来讲,一个HAVING子句必需呈现在GROUPBY子句后,在ORDERBY字句之前。
一个SELECT表达式可使用AS指定一一般名。别号能够看成表达式的列名,用于ORDERBY或HAVING子句中。比方:
mysql>SELECTCONCAT(last_name,,,first_name)ASfull_nameFROMmytableORDERBYfull_name;
在一个WHERE子句中利用一个列别号是不同意的,由于,当WHERE子句被实行时,列值大概还没有被盘算断定。检察章节A.5.4利用alias的限定。
FROMtable_references子句暗示从哪一个表中检索纪录行。假如你定名凌驾凌驾一个表,并实行一个join。关于join句法的信息,检察章节6.4.1.1JOIN句法。关于每一个援用的表,你能够特地指定一一般名。
table_name[[AS]alias][[USEINDEX(key_list)]|[IGNOREINDEX(key_list)]|FORCEINDEX(key_list)]]
到MySQL3.23.12时,当MySQL在从一个表中检索信息时,你能够提醒它选择了哪个索引。假如EXPLAIN显现MySQL利用了大概的索引列表中毛病的索引,这个特征将是很有效的。经由过程指定USEINDEX(key_list),你能够告知MySQL利用大概的索引中最符合的一个索引在表中查找纪录行。可选的二选一句法IGNOREINDEX(key_list)可被用于告知MySQL不利用特定的索引。在MySQL4.0.9中,你也能够利用FORCEINDEX。这个有点像USEINDEX(key_list),可是有了这个附加物,一个表的扫描被接纳时,将会有十分年夜的开支。换句法说,假如没无方法利用给定的索引在表中寻觅纪录行,这时候表扫描才会被利用。USE/IGNORE/FORCEKEY分离是USE/IGNORE/FORCEINDEX的同义词。
你能够以tbl_name(在以后的数据库中)援用一张表,或以dbname.tbl_name明白地指定其个数据。你要以以col_name、tbl_name.col_name或db_name.tbl_name.col_name援用一个列。你不必要在一个SELECT语句中援用的列前指定tbl_name或db_name.tbl_name前缀,除非援用列存在二义性。检察章节6.1.2数据库、表、索引、列和别号,关于有歧义的列援用必要加倍显式的列援用格局。
一个表的援用可使用tbl_name[AS]alias_name赐与别号:
mysql>SELECTt1.name,t2.salaryFROMemployeeASt1,infoASt2->WHEREt1.name=t2.name;mysql>SELECTt1.name,t2.salaryFROMemployeet1,infot2->WHEREt1.name=t2.name;
拔取出来用于输入的列能够在ORDERBY和GROUPBY子句中利用列名、列的别号或列的地位来援用。列的地位从1入手下手:
mysql>SELECTcollege,region,seedFROMtournament->ORDERBYregion,seed;mysql>SELECTcollege,regionASr,seedASsFROMtournament->ORDERBYr,s;mysql>SELECTcollege,region,seedFROMtournament->ORDERBY2,3;
为了以倒序排序,能够在ORDERBY子句顶用于排序的列名后增加一个DESC(递加descending)关头词。缺省为升序排序;这也能够经由过程利用ASC关头词明白指定。
在WHERE子句中可使用MySQL撑持的任何函数。检察章节6.3用于SELECT和WHERE子句的函数。
HAVING子句能够援用任何列或在select_expression中定名的别号。它在最初被实行,仅仅就在项目被送到客户端之前,不举行任何优化。以是不要对应当放在WHERE子句中的项目利用HAVING。举例来讲,不要写成如许:
mysql>SELECTcol_nameFROMtbl_nameHAVINGcol_name>0;
用这个取代:
mysql>SELECTcol_nameFROMtbl_nameWHEREcol_name>0;
在MySQL3.22.5或今后的版本中,你也能够这上面的情势誊写一个查询:
mysql>SELECTuser,MAX(salary)FROMusers->GROUPBYuserHAVINGMAX(salary)>10;
在较早的MySQL版本中,你大概必要用上面的取代了:
mysql>SELECTuser,MAX(salary)ASsumFROMusers->groupbyuserHAVINGsum>10;
DISTINCT、DISTINCTROW和ALL选项指定反复的纪录行是不是被前往。缺省为(ALL),前往一切婚配的纪录行。DISTINCT和DISTINCTROW是同义词,它指定了局集反复的纪录行被扫除。
一切以SQL_开首、STRAIGHT_JOIN和HIGH_PRIORITY的选项是MySQL对ANSISQL的扩大。
HIGH_PRIORITY将给SELECT语句比更新一个表有更高的优先级。你只应当对十分快的或必要当即前往的查询利用它。假如一个表已被读锁定,乃至是有一个更新语句正在守候表的开释,一个SELECTHIGH_PRIORITY查询也将会实行。
SQL_BIG_RESULT能够与GROUPBY或DISTINCT一同利用,以告知优化器了局集将有很多纪录行。在这类情形下,假如必要,MySQL将间接利用基于磁盘的一时表。一样的,在这类情形下,MySQL更乐意以GROUPBY上的一个键举行排序而不是创建一个一时表。
SQL_BUFFER_RESULT将强迫把了局放进一个一时表。这将有助于MySQL尽早地开释表和有助于将年夜的了局集传送到客户端。
SQL_SMALL_RESULT,一个MySQL独有的选项,能够与GROUPBY或DISTINCT一同利用,以告知优化器了局集将会很小。在这类情形下,MySQL将利用疾速的一时表存储了局表,而不是利用排序。在MySQL3.23中,这一般是不必要的。
SQL_CALC_FOUND_ROWS(版本4.0.0和更新的)告知MySQL盘算在不思索LIMIT子句时了局会合将有几行纪录。然后利用SELECTFOUND_ROWS()能够检索到纪录行的数量。检察章节6.3.6.2帮助功效函数。请注重,在早于4.1.0的版本中,LIMIT0是不事情的,它将被优化为当即前往(了局集的纪录数为0)。检察章节5.2.8MySQL怎样优化LIMIT。
假如你利用了QUERY_CACHE_TYPE=2(DEMAND),SQL_CACHE告知MySQL将存储查询了局放进查询高速缓存内。检察章节6.9MySQL的查询高速缓存。
SQL_NO_CACHE告知MySQL不同意将查询了局存储到查询缓存内。检察章节6.9MySQL的查询高速缓存。
假如利用了GROUPBY,输入纪录将会按照GROUPBY列举行排序,就仿佛你对一切GROUPBY中的一切字段利用了ORDERBY。MySQL扩大了GROUPBY的用法,以是你也能够在GROUPBY中指定ASC和DESC:
SELECTa,COUNT(b)FROMtest_tableGROUPBYaDESC
MySQL扩大了的GROUPBY用法同意你拔取没有在GROUPBY子句中说起的字段。假如你的查询没有失掉你所希冀的了局,请检察GROUPBY中的形貌。检察章节6.3.7用于GROUPBY子句的函数。
STRAIGHT_JOIN强迫优化器以表在FROM子句中列出的按次联合。假如优化器以一个非优化的序次联合各表,你可使用它来减速一个查询。检察章节5.2.1EXPLAIN句法(失掉有关SELECT的信息)。
LIMIT子句能够被用于强迫SELECT语句前往指定的纪录数。LIMIT承受一个或两个数字参数。参数必需是一个整数常量。假如给定两个参数,第一个参数指定第一个前往纪录行的偏移量,第二个参数指定前往纪录行的最年夜数量。初始纪录行的偏移量是0(而不是1):为了与PostgreSQL兼容,MySQL也撑持句法:LIMIT#OFFSET#。
mysql>SELECT*FROMtableLIMIT5,10;#检索纪录行6-15
为了检索从某一个偏移量到纪录集的停止一切的纪录行,能够指定第二个参数为-1:
mysql>SELECT*FROMtableLIMIT95,-1;#检索纪录行96-last.
假如只给定一个参数,它暗示前往最年夜的纪录行数量:
mysql>SELECT*FROMtableLIMIT5;#检索前5个纪录行
换句话说,LIMITn等价于LIMIT0,n。
SELECT...INTOOUTFILEfile_name格局的SELECT将选择的纪录行写进一个文件。文件被创建在服务器主机上,而且不成所以已存在的(不论其余,这能够避免数据库表和文件比方`/etc/passwd被损坏)。你必需在服务器主机上有FILE权限来利用这个情势的SELECT。SELECT...INTOOUTFILE次要是成心于让你可以在服务主机上疾速地转储一个表。假如你但愿将了局文件创建在别的的主机上,而不是服务器上,你就不克不及利用SELECT...INTOOUTFILE。在这类情形下,你应当利用某些客户端程序比方mysqldump--tab或mysql-e"SELECT...">outfile发生文件来取代它。SELECT...INTOOUTFILE是LOADDATAINFILE的逆操纵;语句中的export_options部分的句法由FIELDS和LINES子句构成,它们与与用在LOADDATAINFILE语句中的不异。检察章节6.4.9LOADDATAINFILE句法。在了局文本文件中,只要以下的字符被ESCAPEDBY指定的字符本义:ESCAPEDBY字符在FIELDSTERMINATEDBY中的第一个字符在LINESTERMINATEDBY中的第一个字符别的,ASCII0被转换到ESCAPEDBY后而跟一个0(ASCII48)。上述举动的缘故原由是,你必需本义任何FIELDSTERMINATEDBY、ESCAPEDBY或LINESTERMINATEDBY字符,以便能牢靠地将文件读回。ASCII0被本义是为了更简单地利用某些分页程序检察它。由于了局文件其实不必要服从SQL句法,以是别的是不必要本义。上面的例子失掉的文件是可用于很多老程序的格局。
SELECTa,b,a+bINTOOUTFILE"/tmp/result.text"FIELDSTERMINATEDBY,OPTIONALLYENCLOSEDBY"LINESTERMINATEDBY"
"FROMtest_table;
假如利用INTODUMPFILE取代INTOOUTFILE,MySQL将在文件中只写一行,没任何列或行端接和任何本义。假如你但愿存储一个blob列到文件中,这长短常有效的。注重,任何由INTOOUTFILE和INTODUMPFILE创立的文件将被一切用户可读写!缘故原由是,MySQL服务器不克不及够创立一个其他用户具有的文件,(你决不该该以root身份运转mysqld),该文件必需是大众可读写的,以便于你能操纵它。
假如你以页/行锁利用在一个存储引擎上FORUPDATE,被检索的纪录即将被写锁。6.4.1.1JOIN句法
MySQL撑持在SELECT中利用上面所示的JOIN句法:
table_reference,table_referencetable_reference[CROSS]JOINtable_referencetable_referenceINNERJOINtable_referencejoin_conditiontable_referenceSTRAIGHT_JOINtable_referencetable_referenceLEFT[OUTER]JOINtable_referencejoin_conditiontable_referenceLEFT[OUTER]JOINtable_referencetable_referenceNATURAL[LEFT[OUTER]]JOINtable_reference{OJtable_referenceLEFTOUTERJOINtable_referenceONconditional_expr}table_referenceRIGHT[OUTER]JOINtable_referencejoin_conditiontable_referenceRIGHT[OUTER]JOINtable_referencetable_referenceNATURAL[RIGHT[OUTER]]JOINtable_reference
table_reference界说以下:
table_name[[AS]alias][[USEINDEX(key_list)]|[IGNOREINDEX(key_list)]|[FORCEINDEX(key_list)]]
join_condition界说以下:
ONconditional_expr|USING(column_list)
一般不该该在ON存在任何前提式,它是用于限定在了局会合有哪一个行的(关于这个划定规矩也有破例)。假如你但愿哪一个纪录行应当在了局中,你必需在WHERE子句中限定它。
注重,在早于3.23.17的版本中,INNERJOIN不承受一个join_condition!
下面所显现的最初一个LEFTOUTERJOIN句法仅仅是为了与ODBC兼容而存在的:
一个表援用可使用tbl_nameASalias_name或tbl_namealias_name命以别号:
mysql>SELECTt1.name,t2.salaryFROMemployeeASt1,infoASt2->WHEREt1.name=t2.name;
ON前提是能够用在一个WHERE子句中的任何情势的前提。
假如在一个LEFTJOIN的ON或USING部分中右表没有婚配的纪录,一个一切列被设置为NULL的纪录即将被用于右表。你能够经由过程这个举动找到一个表在另外一个表中没有配对物的纪录:
mysql>SELECTtable1.*FROMtable1->LEFTJOINtable2ONtable1.id=table2.id->WHEREtable2.idISNULL;
这个例子在table1中找到一切的纪录行,其id值没有呈现在table2中(即,一切在table1存在的,但在table2中没有对应纪录的纪录行)。固然,这是假定table2.id被声明为NOTNULL的。检察章节5.2.6MySQL怎样优化LEFTJOIN和RIGHTJOIN。
USING(column_list)子句指定了一个列的列表,列表的中列必需同时存在于两个表中。比方USING子句以下所示:
ALEFTJOINBUSING(C1,C2,C3,...)
它能够被界说为在语义上同等于一个如许的ON表达式:
A.C1=B.C1ANDA.C2=B.C2ANDA.C3=B.C3,...
两个表的NATURAL[LEFT]JOIN被界说为在语义上同等于利用了USING子句指定存在于两张表中的一切列的一个INNERJOIN或一个LEFTJOIN。
INNERJOIN和,(逗号)在语义上是同等的。都是在一切的表之间举行一个全联合。一般,在WHERE前提中指定表应当怎样联合。
RIGHTJOIN感化相似于LEFTJOIN。为了坚持数据库边的代码上精简,LEFTJOIN被保举利用来取代RIGHTJOIN。
STRAIGHT_JOIN同等于JOIN,除左表先于右表被读进。当联合优化器将表的按次放错时(很少),这可用于这类情形。
到MySQL3.23.12时,当MySQL在从一个表中检索信息时,你能够提醒它选择了哪个索引。假如EXPLAIN显现MySQL利用了大概的索引列表中毛病的索引,这个特征将是很有效的。经由过程指定USEINDEX(key_list),你能够告知MySQL利用大概的索引中最符合的一个索引在表中查找纪录行。可选的二选一句法IGNOREINDEX(key_list)可被用于告知MySQL不利用特定的索引。在MySQL4.0.9中,你也能够利用FORCEINDEX。这个有点像USEINDEX(key_list),可是有了这个附加物,一个表的扫描被接纳时,将会有十分年夜的开支。换句法说,假如没无方法利用给定的索引在表中寻觅纪录行,这时候表扫描才会被利用。USE/IGNORE/FORCEKEY分离是USE/IGNORE/FORCEINDEX的同义词。
一些例子:
mysql>SELECT*FROMtable1,table2WHEREtable1.id=table2.id;mysql>SELECT*FROMtable1LEFTJOINtable2ONtable1.id=table2.id;mysql>SELECT*FROMtable1LEFTJOINtable2USING(id);mysql>SELECT*FROMtable1LEFTJOINtable2ONtable1.id=table2.id->LEFTJOINtable3ONtable2.id=table3.id;mysql>SELECT*FROMtable1USEINDEX(key1,key2)->WHEREkey1=1ANDkey2=2ANDkey3=3;mysql>SELECT*FROMtable1IGNOREINDEX(key3)->WHEREkey1=1ANDkey2=2ANDkey3=3;
检察章节5.2.6MySQL怎样优化LEFTJOIN和RIGHTJOIN。
6.4.1.2UNION句法
SELECT...UNION[ALL]SELECT...[UNIONSELECT...]
UNION在MySQL4.0.0中被完成。
UNION用于将多个SELECT语句的了局团结到一个了局会合。
在SELECT中的select_expression部排列出的列必需具有一样的范例。第一个SELECT查询中利用的列名将作为了局集的列名前往。
SELECT命令是一个一般的选择命令,可是有以下的限定:
只要最初一个SELECT命令能够有INTOOUTFILE。
假如你不为UNION利用关头词ALL,一切前往的纪录即将是独一的,就仿佛你为全部前往集利用了一个DISTINCT。假如你指定了ALL,那末你将失掉从一切利用的SELECT语句中前往的一切婚配纪录行。
假如你但愿对全部UNION了局利用一个ORDERBY,你应当利用圆括号:
(SELECTaFROMtable_nameWHEREa=10ANDB=1ORDERBYaLIMIT10)UNION(SELECTaFROMtable_nameWHEREa=11ANDB=2ORDERBYaLIMIT10)ORDERBYa;
6.4.2HANDLER句法
HANDLERtbl_nameOPEN[ASalias]HANDLERtbl_nameREADindex_name{=|>=|<=|<}(value1,value2,...)[WHERE...][LIMIT...]HANDLERtbl_nameREADindex_name{FIRST|NEXT|PREV|LAST}[WHERE...][LIMIT...]HANDLERtbl_nameREAD{FIRST|NEXT}[WHERE...][LIMIT...]HANDLERtbl_nameCLOSE
HANDLER语句供应了间接会见MyISAM表存储引擎的接口。
HANDLER语句的第一个情势翻开一个表,经由过程厥后的HANDLER...READ语句使它可读取。这个表工具将不克不及被别的线程共享,也不会被封闭,除非线程挪用HANDLERtbl_nameCLOSE或线程封闭。
第二个情势读取指定的索引服从谁人前提而且合适WHERE前提的一行(或更多的,由LIMIT子句指定)。假如索引由几个部分构成(局限有几个列),值以逗号分开的列表指定;假如只供应的一部分值,那末第一个列是必须的。
第三个情势从表中以索引的按次读取婚配WHERE前提的一行(或更多的,由LIMIT子句指定)。
第四个情势(没有索引清单)从表中以天然的列按次(在数据文件中存储的序次)读取婚配WHERE前提的一行(或更多的,由LIMIT子句指定)。假如希冀做一个全表扫描,它将比HANDLERtbl_nameREADindex_name更快。
HANDLER...CLOSE封闭一个以HANDLER...OPEN翻开的表。
HANDLER是一个略微初级的语句。举例来讲,它不供应分歧性束缚。更切实地说,HANDLER...OPEN不承受一个表的快照,而且不锁定表。这就意味着在一个HANDLER...OPEN被实行后,表数据仍会被(这个或别的的线程)修正,这些修正大概在HANDLER...NEXT和HANDLER...PREV扫描中才会部分地呈现。
利用这个接口取代一般SQL的缘故原由是:
它比SELECT快,由于:在HANDLEROPEN中,一个指定的存储引擎被分派给以后线程。较少的庞大剖析。没有优化器和没有查询反省开支。在两个处置哀求之间不必要锁定利用的表。接口处置机其实不供应一个分歧性的检察数据(举例来讲,读净化dirty-reads是同意的),因此,存储引擎能够做SQL一般不同意的优化。它使得加倍简单地移植一个利用对MySQL的ISAM相似接口的使用程序。它同意你在一个以SQL不简单完成(在某些不成能的完整)的情形下遍历一个数据库。当利用供应了一个交互式的用户接口会见数据库的使用程序时,接口处置机是加倍天然的检察数据的体例。6.4.3INSERT句法
INSERT[LOW_PRIORITY|DELAYED][IGNORE][INTO]tbl_name[(col_name,...)]VALUES((expression|DEFAULT),...),(...),...[ONDUPLICATEKEYUPDATEcol_name=expression,...]orINSERT[LOW_PRIORITY|DELAYED][IGNORE][INTO]tbl_name[(col_name,...)]SELECT...orINSERT[LOW_PRIORITY|DELAYED][IGNORE][INTO]tbl_nameSETcol_name=(expression|DEFAULT),...[ONDUPLICATEKEYUPDATEcol_name=expression,...]
INSERT将新行拔出到一个已存在的表中。INSERT...VALUES情势的语句基于明白的值拔出纪录行。INSERT...SELECT情势的语句从另外一个或多个表当选掏出值,并将其拔出。有多重值列表的INSERT...VALUES情势的语句在MySQL3.22.5或更新的版本中被撑持。col_name=expression句法在MySQL3.22.10或更新的版本中失掉撑持。
tbl_name是纪录将要被拔出的表。列名列表或SET子句指出语句指定的值赋给哪一个列:
假如在INSERT...VALUES或INSERT...SELECT中没有指定列列表,那末一切列的值必需在VALUES()列表中或由SELECT供应。假如你不晓得表的列的序次,可使用DESCRIBEtbl_name来决意它。
任何没有明白指定一个值的列均会被设置为它的缺省值。举例来讲,假如你指定的一个列列表没有指定表中一切的列,未指定的列将被设置为它们的缺省值。缺省值赋值的形貌在章节6.5.3CREATETABLE句法。你也能够利用关头词DEFAULT来将一个列设置为它的默许值(这在MySQL4.0.3中被新到场)。这使它加倍简单地誊写付与值到一切除几列的INSERT语句,由于它同意您制止誊写一个不完整的VALUES()的列表(在该列表没有包括表中的每一个列的列值)。不然,你将不能不在VALUES()列表中写出列列表指定对应的值。MySQL一般城市为每一个字段设置一个缺省值。这是某些强加在MySQL上的,在事件型表与非事件型表中均事情。我们的概念是在使用程序端反省字段的内容,而不是在数据库服务器端。
一个expression能够援用先前在值列表中设置的任何列。比方,你能够如许:
mysql>INSERTINTOtbl_name(col1,col2)VALUES(15,col1*2);
可是不克不及如许:
mysql>INSERTINTOtbl_name(col1,col2)VALUES(col2*2,15);
假如你指定关头词LOW_PRIORITY,INSERT的实行将会被提早,直到没有别的客户正直在读取表。在这类情形下,客户端不能不守候拔出语句被完成,假如表被频仍地利用,那末这将会消费很长一段工夫。这与INSERTDELAYED让客户端当即持续实行恰好相反。检察章节6.4.4INSERTDELAYED句法。注重,LOW_PRIORITY一般不合错误MyISAM利用,由于这将克制并发的拔出。检察章节7.1MyISAM表。
假如你在一个有很多笔记录行值的INSERT中指定关头词IGNORE,任安在表中现有的PRIMARY或UNIQUE键上反复的纪录行均会被疏忽而不被拔出。假如你不指定IGNORE,当有任何纪录行在一个现有的键值上反复时,拔出均会被中断。你能够经由过程CAPI函数mysql_info()测定共有几纪录行被拔出到表中。
假如你指定ONDUPLICATEKEYUPDATE子句(在MySQL4.1.0中被新到场),而且被拔出的一个纪录行在PRIMARY或UNIQUE键大将会发生一个反复值,那末老的纪录即将被UPDATE。举例来讲:
mysql>INSERTINTOtable(a,b,c)VALUES(1,2,3)-->ONDUPLICATEKEYUPDATEc=c+1;
假定列a被界说为UNIQUE,而且已存在了一个1,它将与上面的语句发生一样的了局:
mysql>UPDATEtableSETc=c+1WHEREa=1;
注重:假如列b也是独一的,UPDATE命令将要被写成如许:
mysql>UPDATEtableSETc=c+1WHEREa=1ORb=2LIMIT1;
而且假如a=1ORb=2婚配几个纪录行,只要一个纪录即将被更新!大致上,在有多重UNIQUE键的表上,你应当尽是制止利用ONDUPLICATEKEY子句。当利用了ONDUPLICATEKEYUPDATE后,DELAYED选项将被疏忽。
假如MySQL被设置为利用DONT_USE_DEFAULT_FIELDS选项,INSERT语句将发生一个毛病,除非你为一切必要一个非NULL值的列明白指定值。检察章节2.3.3典范的configure选项。
经由过程利用mysql_insert_id函数你能够找到用于一个AUTO_INCREMENT列的值。检察章节8.1.3.130mysql_insert_id()。
假如你利用INSERT...SELECT或一个INSERT...VALUES语句拔出多值列,你可使用CAPI函数mysql_info()失掉查询的信息。信息字串的格局以下:
Records:100Duplicates:0Warnings:0
Duplicates指出因与某些现有的独一索引值反复而不克不及被拔出的纪录行数量。Warnings指出在实验拔出的列值中在某些方面大概有成绩的数量。鄙人列任何一个前提下,告诫城市产生:
向一个界说为NOTNULL的列中拔出NULL值。该列被设置为它的缺省值。将一个超越列局限的值赋给一个数字列。该值被剪切到该局限内的得当的端点。将一个比方10.34a的值赋给一个数字列。尾部的无用信息将被剥离,保存数字部分并将其拔出。假如该值看起来基本就不是一个数字,该列将被设置为0。将一个超越了列最年夜长度的字符串拔出到一个CHAR、VARCHAR、TEXT或BLOB列中。该值将被剪切到该列的最年夜长度。将一个对列范例分歧法的值拔出到一个日期或工夫列中。该列被得当格局的零值。
6.4.3.1INSERT...SELECT句法
INSERT[LOW_PRIORITY][IGNORE][INTO]tbl_name[(columnlist)]SELECT...
利用INSERT...SELECT语句,你能够从一个或多个表中读取多个纪录行,并将其疾速地拔出到一个表中。
INSERTINTOtblTemp2(fldID)SELECTtblTemp1.fldOrder_IDFROMtblTemp1WHEREtblTemp1.fldOrder_ID>100;
一个INSERT...SELECT语句有以下前提的限止:
INSERT语句中的方针表不克不及在SELECT查询部分的FROM子句中呈现,由于在ANSISQL中,克制你从正在拔出的表中SELECT。(成绩是由于,SELECT大概会发明在统一运转期内先前被拔出的纪录。当利用子选择子句时,这类情形将会更简单搅浑!)AUTO_INCREMENT列像寻常一样事情。你可使用CAPI函数mysql_info()失掉查询的信息。检察章节6.4.3INSERT句法。为了确保二进制日记能够被用于重修最后的表,MySQL将不同意在INSERT...SELECT时代并发的拔出。
你固然也能够利用REPLACE取代INSERT来盖写老的纪录行。
6.4.4INSERTDELAYED句法
INSERTDELAYED...
INSERT语句的DELAYED选项是一个MySQL独有的选项,假如你的客户端不克不及守候INSERT的完成,这将会是很有效的。ThisisacommonproblemwhenyouuseMySQLforloggingand当你翻开日记纪录利用MySQL而且你周期性的需消费很长工夫才完成的SELECT和UPDATE语句时,这将是一个很广泛的成绩。DELAYED在MySQL3.22.15中被引进。它是MySQL对ANSISQL92的一个扩大。
INSERTDELAYED仅仅事情与ISAM和MyISAM表。注重,由于MyISAM表撑持并发的SELECT和INSERT,假如在数据文件中没有余暇的块,那你将很少必要对MyISAM表利用INSERTDELAYED。检察章节7.1MyISAM表。
当你利用INSERTDELAYED时,客户端将当即失掉一个OK,当表不被任何别的线程利用时,该即将被拔出。
利用INSERTDELAYED的另外一个次要的优点就是,从良多客户端来的拔出哀求会被打包在一同并写进一个块中。这比做很多独自的拔出要快的多。
注重,以后的纪录行行列是被存储在内存中的,一向到他们被拔出到表中。这就意味着,假如你利用强迫的办法(kill-9)杀逝世mysqld,大概假如不测地逝世失落,任何没有写到磁盘中的纪录行行列都将会丧失!
上面具体地形貌当你为INSERT或REPLACE利用DELAYED选项时会产生甚么。在这个形貌中,“线程”是碰到一个INSERTDELAYED命令的线程,“处置器”是处置一切关于一个特定表的INSERTDELAYED语句的线程。
当一个线程对一个表实行一个DELAYED语句时,将会创立一个处置器线程用以处置对该表的一切DELAYED语句,除非如许的处置器已存在。
线程反省处置器是不是已取得了一个DELAYED锁;假如还没有,这告知处置程序往取得。即便别的的线程已在表上加了一个READ或WRITE锁,也能取得DELAYED锁。但是,处置器将守候一切的ALTERTABLE锁或FLUSHTABLES以包管表布局是最新的。
线程实行INSERT语句,可是其实不将纪录行写到表中,它将终极的纪录行的正本放到被处置器线程办理的行列中。任何语法毛病城市被线程发明并呈报给客户程序。
客户端不克不及呈报了局纪录行中反复次数或AUTO_INCREMENT值;它不克不及从服务器取得它们,由于INSERT早在拔出操纵被完成之前就前往了。假如你利用CAPI,mysql_info()函数也因一样的缘故原由而不克不及取得任何成心义的信息。
当纪录行被拔出到表中时,二进制的日记文件将被处置器线程更新。关于多纪录行的拔出,当第一个纪录行被拔出时,二进制日记被更新。
当每写进delayed_insert_limit个纪录行后,处置器反省是不是仍有任何SELECT语句没有办理。假如是如许,处置器同意在持续之前让这些语句先实行。
当处置器发明在它的行列中没有太多的纪录行时,表将被解锁。假如在delayed_insert_timeout秒内没有吸收到新的INSERTDELAYED命令,处置器线程将停止。
假如在一个特定的处置器行列中已有凌驾delayed_queue_size个纪录行未被办理,线程请求INSERTDELAYED守候,只到在行列中有可用空间。如许做是为了包管mysqld服务器对提早内存行列不利用全体的内存。
处置器线程在MySQL历程列表中的Command列上显现为delayed_insert。假如实行一个FLUSHTABLES命令或以KILLthread_id杀逝世它,它将会被杀逝世。但是,它在加入前会起首将所行列纪录行保留到表中。这些时代,它将不再吸收别的线程的任何新的INSERT命令。假如再此以后实行一个INSERTDELAYED命令,一个新处置器线程将会被创立。注重,下面的意义是,假如一个INSERTDELAYED处置器已在运转,那末INSERTDELAYED命令将有比一般INSERT命令更高的优先级!别的的更新命令将不能不比及INSERTDELAYED行列被清空,杀逝世处置器线程(以KILLthread_id)或实行FLUSHTABLES。
以下形态变量供应了有关INSERTDELAYED命令的信息:变量寄义Delayed_insert_threads处置器线程数量Delayed_writes利用INSERTDELAYED写进的纪录行的数量Not_flushed_delayed_rows守候被写进的纪录行数量经由过程收回一个SHOWSTATUS语句或经由过程实行一个mysqladminextended-status命令,你能够检察这些变量。
注重,假如表没有在利用中,INSERTDELAYED将比一个一般的INSERT慢。让服务器为你利用INSERTDELAYED的每张表处置一个独自的线程,也是有分外的开支的。这就意味着,你应当在断定你切实其实必要它时才利用INSERTDELAYED。
6.4.5UPDATE句法
UPDATE[LOW_PRIORITY][IGNORE]tbl_nameSETcol_name1=expr1[,col_name2=expr2...][WHEREwhere_definition][ORDERBY...][LIMITrows]orUPDATE[LOW_PRIORITY][IGNORE]tbl_name[,tbl_name...]SETcol_name1=expr1[,col_name2=expr2...][WHEREwhere_definition]
UPDATE以新的值更新现存表中行的列。SET子句指出要修正哪一个列和他们应当给定的值。WHERE子句假如被给出,指定哪一个纪录行应当被更新。不然,一切的纪录行被更新。假如ORDERBY子句被指定,纪录即将被以指定的序次更新。
假如你指定关头词LOW_PRIORITY,UPDATE的实行将被提早,直到没有别的的客户正直在读取表。
假如你指定关头词IGNORE,该更新语句将不会非常中断,即便在更新过程当中呈现反复键毛病。招致抵触的纪录即将不会被更新。
假如在一个表达式中从tbl_name中会见一个列,UPDATE利用列确当前值。举例来讲,上面的语句设置age列值为它确当前值加1:
mysql>UPDATEpersondataSETage=age+1;
UPDATE赋值是从左到右盘算的。举例来讲,以下语句将age列设置为它的两倍,然后再加1:
mysql>UPDATEpersondataSETage=age*2,age=age+1;
假如你设置列为其以后的值,MySQL注重到这点,其实不更新它。
UPDATE前往实践被改动的纪录行数量。在MySQL3.22或更新的版本中,CAPI函数mysql_info()前往被婚配并更新的纪录行数量,和在UPDATE时代产生的告诫的数量。
在MySQL3.23中,你可使用LIMIT#来确保只要给定的纪录行数量被变动。
假如一个ORDERBY子句被利用(从MySQL4.0.0入手下手撑持),纪录即将以指定的序次被更新。这实践上只要连同LIMIT一同才有效。
从MySQL4.0.4入手下手,你也能够实行一个包括多个表的UPDATE的操纵:
UPDATEitems,monthSETitems.price=month.priceWHEREitems.id=month.id;
注重:多表UPDATE不成以利用ORDERBY或LIMIT。
6.4.6DELETE句法
DELETE[LOW_PRIORITY][QUICK]FROMtable_name[WHEREwhere_definition][ORDERBY...][LIMITrows]orDELETE[LOW_PRIORITY][QUICK]table_name[.*][,table_name[.*]...]FROMtable-references[WHEREwhere_definition]orDELETE[LOW_PRIORITY][QUICK]FROMtable_name[.*][,table_name[.*]...]USINGtable-references[WHEREwhere_definition]
DELETE从table_name中删除where_definition中给定前提的纪录行,并前往删除的纪录数量。
假如你收回一个没有WHERE子句的DELETE,一切的纪录即将被删除。假如你以AUTOCOMMIT形式实行它,那末它相似于TRUNCATE。检察章节6.4.7TRUNCATE句法。在MySQL3.23中,没有一个WHERE子句的DELETE将前往零作为受影响的纪录数量。
当你删除一切纪录行时,假如你真的但愿晓得几笔记录被删除,你可使用一个这类情势的DELETE语句:
mysql>DELETEFROMtable_nameWHERE1>0;
注重,这将比一个没有WHERE子句的DELETEFROMtable_name语句慢,由于它一次只删除一行。
假如你指定关头词LOW_PRIORITY,DELETE的实行将被提早,直到没有别的的客户正直在读取表。
假如你指定关头词QUICK,那末在删除过程当中存储引擎将不会合并索引叶,这大概会减速某些范例的删除操纵。
在MyISAM表中,删除的纪录被放在一个链接表中保护,今后的INSERT操纵将从头利用删除后的纪录地位。为了接纳闲置的空间,并减小文件尺寸,利用OPTIMIZETABLE语句或myisamchk有用程序从头构造表。OPTIMIZETABLE利用对照简单,可是myisamchk更快点。检察章节4.5.1OPTIMIZETABLE句法和章节4.4.6.10表优化。
第一个多表删除格局从MySQL4.0.0入手下手被撑持。第二个多表删除格局从MySQL4.0.2入手下手被撑持。
仅仅在FROM或USING子句之前列出的表中的婚配纪录行被删除。效果就是,你要以从多个表中同时删除纪录行,而且一样能够有别的的表用于检索。
在表名后的.*仅仅是为了兼容Access:
DELETEt1,t2FROMt1,t2,t3WHEREt1.id=t2.idANDt2.id=t3.idorDELETEFROMt1,t2USINGt1,t2,t3WHEREt1.id=t2.idANDt2.id=t3.id
在下面的情形下,我们仅仅从t1和t2表中删除婚配的纪录行。
假如一个ORDERBY子句被利用(从MySQL4.0.0入手下手撑持),纪录即将以指定的序次删除。这实践上只要连同LIMIT一同才有效。示比方下:
DELETEFROMsomelogWHEREuser=jcoleORDERBYtimestampLIMIT1
这将删除婚配WHERE子句的,而且最早被拔出(经由过程timestamp来断定)的纪录行。
DELETE语句的LIMITrows选项是MySQL独有的,它告知服务器在把持权被前往到客户端之前可被删除的最年夜纪录行数量。这能够用来确保一个特定的DELETE命令不会占用太长的工夫。你能够复杂地反复利用DELETE命令,直到被影响的纪录行数量小于LIMIT值。
从MySQL4.0入手下手,在DELETE语句中能够指定多个表,用以从一个表中删除依附于多表中的特别情形的纪录行。但是,在一个多表删除中,不克不及利用ORDERBY或LIMIT。
6.4.7TRUNCATE句法
TRUNCATETABLEtable_name
在3.23中,TRUNCATETABLE被映照为COMMIT;DELETEFROMtable_name。检察章节6.4.6DELETE句法。
鄙人面的体例中,TRUNCATETABLE分歧于DELETEFROM...:
删简操纵打消偏重建表,这将比一个接一个地删除纪录行要快很多。非事件平安的;假如存在一个举动的事件或一个无效的表锁定,你将会失掉一个毛病。不前往删除的纪录行数量。只需表界说文件`table_name.frm是无效的,即便数据或索引文件已被破坏,也能够经由过程这类体例重修表。
TRUNCATE是一个OracleSQL的扩大。
6.4.8REPLACE句法
REPLACE[LOW_PRIORITY|DELAYED][INTO]tbl_name[(col_name,...)]VALUES(expression,...),(...),...orREPLACE[LOW_PRIORITY|DELAYED][INTO]tbl_name[(col_name,...)]SELECT...orREPLACE[LOW_PRIORITY|DELAYED][INTO]tbl_nameSETcol_name=expression,col_name=expression,...
REPLACE功效与INSERT完整一样,除假如在表中存在一个老的纪录与新纪录在一个UNIQUE或PRIMARYKEY上有不异的值,那末在新纪录被拔出之前,老的纪录将被删除。检察章节6.4.3INSERT句法。
换句话说,你不成以从一个REPLACE中会见老的纪录行的值。某些老的MySQL版本中,你也许能够如许做,可是这是一个Bug,如今已被修改了。
为了可以利用REPLACE,你必需有对该表的INSERT和DELETE权限。
当你利用一个REPLACE时,假如新的纪录行取代了老的纪录行,mysql_affected_rows()将前往2。这是由于在新行被拔出之前,反复纪录行被先删除。
这个现实使得判别REPLACE是不是是增加一笔记录仍是交换一笔记录很简单:反省受影响纪录行的值是1(增加)仍是2(交换)。
注重,除非你利用一个UNIQUE索引或PRIMARYKEY,利用REPLACE命令是没有感到的,由于它会仅仅实行一个INSERT。
6.4.9LOADDATAINFILE句法
LOADDATA[LOW_PRIORITY|CONCURRENT][LOCAL]INFILEfile_name.txt[REPLACE|IGNORE]INTOTABLEtbl_name[FIELDS[TERMINATEDBY ][[OPTIONALLY]ENCLOSEDBY][ESCAPEDBY]][LINESTERMINATEDBY
][IGNOREnumberLINES][(col_name,...)]
LOADDATAINFILE语句以十分高的速率从一个文本文件中读取纪录行并拔出到一个表中。假如LOCAL关头词被指定,文件从客户端主机读取。假如LOCAL没有被指定,文件必需位于服务器上。(LOCAL在MySQL3.22.6或更新的版本中被撑持。)
因为平安性的缘故原由,当读取位于服务器真个文本文件时,文件必需处于数据库目次或可被一切人读取的中央。同时,为了对服务器真个文件利用LOADDATAINFILE,你必需在服务器主机上有FILE权限。检察章节4.2.7由MySQL供应的权限。
在MySQL3.23.49和MySQL4.0.2中,只要当你没有以--local-infile=0选项启动mysqld,或你没有克制你的客户端程序撑持LOCAL的情形下,LOCAL才会事情。检察章节4.2.4LOADDATALOCAL的平安性成绩.
假如你指定关头词LOW_PRIORITY,LOADDATA语句的实行将会被提早,直到没有别的的客户正直在读取表。
假如你对一个MyISAM表指定关头词CONCURRENT,那末当LOADDATA正在实行时,别的的线程仍能够从表中检索数据。利用这个选项时,假如同时也有别的的线程正在利用表,这固然会有一点影响LOADDATA的实行功能。
利用LOCAL将比让服务器间接会见文件要慢一些,由于文件的内容必需从客户端主机传送到服务器主机。而在另外一方面,你不再必要有FILE权限用于装载当地文件。
假如你利用先于MySQL3.23.24的版本,你不克不及够以LOADDATAINFILE读取一个FIFO。假如你必要从一个FIFO(比方,gunzip的输入文件)中读取,可使用LOADDATALOCALINFILE取代。
你也能够利用mysqlimport有用程序装载数据文件;它经由过程发送一个LOADDATAINFILE命令到服务器来举措。--local选项使得mysqlimport从客户端主机读取数据文件。假如客户端与服务器撑持紧缩协定,你能够指定--compress选项,以在较慢的收集中取得更好的功能。
当从服务器主机定位文件时,服务器利用以下划定规矩:
假如给定一个完全的路径,服务器利用该路径名。假如给定一个有一个或多个前置构件的绝对路径,服务器以绝对服务器的数据目次搜刮文件。假如给定一个没有前置构件的文件名,服务器从以后数据库的数据库目次征采文件。
注重,这些划定规矩意味着,一个以`./myfile.txt给出的文件是从服务器的数据目次中读取的,但是,以`myfile.txt给出的一个文件是从以后数据库的数据目次下读取的。举例来讲,上面的LOADDATA语句从db1数据库目次下读取文件`data.txt,由于db1是以后数据库,即便该语句明白地指定读取的文件被放进到db2数据库中的一个表中:
mysql>USEdb1;mysql>LOADDATAINFILE"data.txt"INTOTABLEdb2.my_table;
REPLACE和IGNORE关头词把持对与现有的纪录在独一键值上反复的纪录的处置。假如你指定REPLACE,新的纪录即将交换有不异独一键值的现有纪录行。假如你指定IGNORE,将跳过与现有的纪录行在独一键值上反复的输出纪录行。假如你没有指定任何一个选项,当反复键值呈现时,将会产生一个毛病,文本文件的残剩部分也将被疏忽。
假如你利用LOCAL关头词从一个当地文件中读取数据,在此操纵过程当中,服务器没有举措中断文件的传送,因而缺省的处置体例就仿佛是IGNORE被指定一样。
假如你在一个空的MyISAM表上利用LOADDATAINFILE,一切非独一索引会以一个分批体例被创立(就像REPAIR)。当有很多索引时,这一般可使LOADDATAINFILE更快一些。
LOADDATAINFILE的SELECT...INTOOUTFILE的逆操纵。检察章节6.4.1SELECT句法。利用SELECT...INTOOUTFILE将数据从一个数据库写到一个文件中。利用LOADDATAINFILE读取文件到数据库中。两个命令的FIELDS和LINES子句的句法是一样的。两个子句都是可选的,可是假如两个同时被指定,FIELDS子句必需呈现在LINES子句之前。
假如你指定一个FIELDS子句,它的子句(TERMINATEDBY、[OPTIONALLY]ENCLOSEDBY和ESCAPEDBY)也是可选的,不外,你必需最少指定它们中的一个。
假如你没有指定一个FIELDS子句,缺省的不异于假如你如许写:
FIELDSTERMINATEDBY ENCLOSEDBYESCAPEDBY
假如你没有指定一个LINES子句,缺省的不异于假如你如许写:
LINESTERMINATEDBY
换句话说,当读取输出时,缺省值招致LOADDATAINFILE体现以下:
在换行符处寻觅行的界限。在定位符处将行分隔放到字段中。不以为字段由任何引号字符封装。将有“”开首的定位符、换行符或`注释为字段值的一个笔墨字符。
相反的,当写进输入时,缺省值招致SELECT...INTOOUTFILE体现以下:
在字段值间加上定位符。不必任何引号字符封装字段。利用“”本义呈现在字段值中的定位符、换行符或`字符实例。外行的开头处加上换行符。
注重,为了写FIELDSESCAPEDBY,你必需指定两个反斜线,该值会作为一个反斜线被读进。
IGNOREnumberLINES选项可被用于疏忽文件开首处的一个列名的头:
mysql>LOADDATAINFILE"/tmp/file_name"INTOTABLEtestIGNORE1LINES;
当你一前一后地利用SELECT...INTOOUTFILE和LOADDATAINFILE将数据从一个数据库写到一个文件中,然后再从文件中将它读进数据库中时,两个命令的字段和行处置选项必需婚配。不然,LOADDATAINFILE将不克不及准确地注释文件内容。假定你利用SELECT...INTOOUTFILE以逗号分开字段的体例将数据写进到一个文件中:
mysql>SELECT*INTOOUTFILEdata.txt->FIELDSTERMINATEDBY,->FROM...;
为了将由逗号分开的文件读回时,准确的语句应当是:
mysql>LOADDATAINFILEdata.txtINTOTABLEtable2->FIELDSTERMINATEDBY,;
假如你试图用上面所示的语句读取文件,它将不会事情,由于命令LOADDATAINFILE以定位符辨别字段值:
mysql>LOADDATAINFILEdata.txtINTOTABLEtable2->FIELDSTERMINATEDBY ;
大概的了局是每一个输出即将被注释为一个独自的字段。
LOADDATAINFILE也能够被用来读取从内部来历取得的文件。比方,dBASE格局的文件,字段以逗号分开并以双引号包抄着。假如文件中的行以一个换行符停止,那末上面所示的能够申明你将用来装载文件的字段和行处置选项:
mysql>LOADDATAINFILEdata.txtINTOTABLEtbl_name->FIELDSTERMINATEDBY,ENCLOSEDBY"->LINESTERMINATEDBY
;
任何字段和行处置选项都能够指定一个空字符串()。假如不是空的,FIELDS[OPTIONALLY]ENCLOSEDBY和FIELDSESCAPEDBY值必需是一个单个字符。FIELDSTERMINATEDBY和LINESTERMINATEDBY值能够凌驾一个字符。比方,为了写进由回车换行符停止的行,或读取包括如许的行的文件,应当指定一个LINESTERMINATEDBY
子句。
举例来讲,为了读取一个文件到一个SQL表中,文件以一行%%分开(开顽笑的),你能够如许做:
CREATETABLEjokes(aINTNOTNULLAUTO_INCREMENTPRIMARYKEY,jokeTEXTNOTNULL);LOADDATAINFILE"/tmp/jokes.txt"INTOTABLEjokesFIELDSTERMINATEDBY""LINESTERMINATEDBY"
%%
"(joke);
FIELDS[OPTIONALLY]ENCLOSEDBY把持字段的包抄字符。关于输入(SELECT...INTOOUTFILE),假如你省略单词OPTIONALLY,一切的字段被ENCLOSEDBY字符包抄。如许的一个输入文件(以一个逗号作为字段分界符)示比方下:
"1","astring","100.20""2","astringcontaininga,comma","102.20""3","astringcontaininga"quote","102.20""4","astringcontaininga",quoteandcomma","102.20"
假如你指定OPTIONALLY,ENCLOSEDBY字符仅被感化于包抄CHAR和VARCHAR字段:
1,"astring",100.202,"astringcontaininga,comma",102.203,"astringcontaininga"quote",102.204,"astringcontaininga",quoteandcomma",102.20
注重,在一个字段值中呈现的ENCLOSEDBY字符,经由过程用ESCAPEDBY字符作为其前缀对其本义。同时也要注重,假如你指定一个空的ESCAPEDBY值,大概会发生不克不及被LOADDATAINFILE准确读出的输入文件。比方,假如本义字符为空,下面显现的输入将酿成以下显现的输入。请注重第四行的第二个字段,它包括一个逗号跟在一个引号后的两个字符,这(毛病的)看起来像是一个字段的停止:
1,"astring",100.202,"astringcontaininga,comma",102.203,"astringcontaininga"quote",102.204,"astringcontaininga",quoteandcomma",102.20
关于输出,ENCLOSEDBY字符假如存在,它将从字段值的尾部被剥离。(不论OPTIONALLY是不是被指定,都是如许;关于输出注释,OPTIONALLY不会影响它。)由ESCAPEDBY字符抢先于ENCLOSEDBY字符的呈现,将被注释为以后字段值的一部分。别的,在字段中呈现的反复的ENCLOSEDBY字符被注释为单个ENCLOSEDBY,只需字段自己也是以该字符入手下手的。比方,假如ENCLOSEDBY"被指定,引号将做以下处置:
"The""BIG""boss"->The"BIG"bossThe"BIG"boss->The"BIG"bossThe""BIG""boss->The""BIG""boss
FIELDSESCAPEDBY把持怎样写进或读出特别字符。假如FIELDSESCAPEDBY字符不是空的,它将被用于做为以下输入字符的前缀:FIELDSESCAPEDBY字符FIELDS[OPTIONALLY]ENCLOSEDBY字符FIELDSTERMINATEDBY和LINESTERMINATEDBY值的第一个字符。ASCII0(实践上在本义字符后写上ASCII0,而不是一个零值字节)
假如FIELDSESCAPEDBY字符为空,没有字符被本义。指定一个空的本义字符大概不是一个好的主张,出格是假如你的数据字段值中包括方才列表中的任何字符时。
关于输出,假如FIELDSESCAPEDBY字符不为空,该字符的呈现将会被剥离,后续的字符在字面上做为字段值的一部分。除一个本义的“0”或“N”(即, 或N,假如本义字符为`)。这些序列被注释为ASCII0(一个零值字节)和NULL。检察上面的有关NULL处置的划定规矩。
关于更多的“”本义句法信息,检察章节6.1.1笔墨:怎样写字符串与数字。
在某些情形下,字段与行处置互相感化:
假如LINESTERMINATEDBY是一个空字符串,FIELDSTERMINATEDBY长短空的,行也用FIELDSTERMINATEDBY停止。假如FIELDSTERMINATEDBY和FIELDSENCLOSEDBY值都是空的(),一个流动行(无定界符)格局被利用。用流动行格局时,在字段之间不利用分开符。取代的,列值的写进和读取利用列的“显现”宽度。比方,假如一个列被界说为INT(7),列的值将利用7个字符的字段被写进。关于输出,列值经由过程读取7个字符来取得。流动行格局也影响对NULL值的处置;见上面。注重,假如你正在利用一个多字节的字符集,流动长度格局将不克不及事情。
NULL值的处置有良多,取决于你所利用的FIELDS和LINES选项:
关于缺省的FIELDS和LINES值,输入时,NULL被写成N,当读进时,N被作为NULL读进(假定ESCAPEDBY字符为“”)。假如FIELDSENCLOSEDBY长短空的,一个字段包括笔墨词NULL的,它的值做为一个NULL值被读进(这分歧于被FIELDSENCLOSEDBY包抄的词NULL,它是被作为NULL读进的)。假如FIELDSESCAPEDBY是空的,NULL值被写为词NULL。用流动行格局时(它产生于FIELDSTERMINATEDBY和FIELDSENCLOSEDBY二者均为空),NULL被写为一个空的字符串。注重,当将表中的NULL值和空字符串一同写到文件中时,它们将被搅浑,由于它们都是作为空字符串被写进的。假如你在文件时,必要对他们两个举行辨别,你不该该利用流动行格局。
一些不克不及被LOADDATAINFILE撑持的情形:流动尺寸的纪录行(FIELDSTERMINATEDBY和FIELDSENCLOSEDBY均为空)和BLOB或TEXT列。假如你指定一个分开符与另外一个不异,或是另外一个的前缀,LOADDATAINFILE大概会不克不及准确地注释输出。比方,以下的FIELDS子句将会发生成绩:
FIELDSTERMINATEDBY"ENCLOSEDBY"
假如FIELDSESCAPEDBY为空,一个字段值中包括有FIELDSENCLOSEDBY或LINESTERMINATEDBY被FIELDSTERMINATEDBY跟从的值时,将会引发LOADDATAINFILE过早地中断读取一个字段或一行。这是由于LOADDATAINFILE不克不及够准确地决意字段或行值在那里了局。
上面的例子将装载persondata表的一切列:
mysql>LOADDATAINFILEpersondata.txtINTOTABLEpersondata;
没有字段列被指定,因此LOADDATAINFILE以为输出行包括表列中一切的字段。利用缺省的FIELDS和LINES值。
假如你但愿装载表中的某些列,那指定一个字段列表:
mysql>LOADDATAINFILEpersondata.txt->INTOTABLEpersondata(col1,col2,...);
假如输出文件的字段序次分歧于表中列的按次,你也必需指定一个字段列表。不然MySQL不晓得怎样将输出字段与表中的列婚配。
假如一个行有很少的字段,没有输出字段的列将被设置为缺省值。缺省值赋值在章节6.5.3CREATETABLE句法中被形貌。
一个空的字段值分歧于字段值丧失的注释:
关于字符串范例,列被设置为空字符串。关于数字范例,列被设置为0。关于日期和工夫范例,列被设置为合适列范例的“零”值。检察章节6.2.2Date和Time范例。
注重,假如在一个INSERT或UPDATE语句中明白地将一个空字符串赋给一个字符串、数字或日期或工夫范例,你会失掉与下面不异的了局。
假如对TIMESTAMP列指定一个NULL值,大概当字段列表被指准时,TIMESTAMP在字段列表中被漏掉(仅仅第一个TIMESTAMP列被影响),TIMESTAMP列会被设置为以后的日期和工夫。
假如输出的纪录行有太多的字段,过剩的字段将被疏忽,并增添告诫的数量。
LOADDATAINFILE以为一切的输出均是字符串,因此,关于ENUM或SET列,你不克不及以INSERT语句的情势为其设置数字值。一切的ENUM和SET必需以字符串指定!
假如你正在利用CAPI,当LOADDATAINFILE查询停止时,你能够挪用API函数mysql_info()取得有关查询的信息。信息串的格局以下:
Records:1Deleted:0Skipped:0Warnings:0
告诫会在某些情形下产生,这些情形与值经由过程INSERT语句拔出时产生告诫的情形一样(检察章节6.4.3INSERT句法),可是LOADDATAINFILE有一点与它纷歧样,当在输出行中有太多或过少的字段,它也会发生告诫。告诫不会被存储在任何田主;告诫的数量仅能暗示统统是不是顺遂。假如失掉告诫,并但愿切实地晓得为何会失掉它们,一个办法就是利用SELECT...INTOOUTFILE,将它保留到别的一个文件中,并与本来的输出文件举行对照。
假如你必要LOADDATA从一个管道中读取,你可使用上面的技能:
mkfifo/mysql/db/x/xchmod666/mysql/db/x/xcat</dev/tcp/10.1.1.12/4711>/nt/mysql/db/x/xmysql-e"LOADDATAINFILExINTOTABLEx"x
假如你利用的版本早于MySQL3.23.25,你只能经由过程LOADDATALOCALINFILE来实行下面。
有关INSERT绝对LOADDATAINFILE的效力和加速LOADDATAINFILE的更多信息,请检察章节5.2.9INSERT查询的速率。
6.4.10DO句法
DOexpression,[expression,...]
实行表达式,但不前往任何了局。这是SELECTexpression,expression的一个缩写,可是当你其实不体贴了局时,它稍有点上风,由于它稍稍快一点。
这次要无益于有反作用的函数,好比RELEASE_LOCK。
MySQL采用双重授权(DualLicensed),它们是GPL和MySQLAB制定的商业许可协议。 |
|