老尸 发表于 2015-1-16 20:13:50

绝无经由的MySQL 5.0新特征教程 存储历程:第一讲

怀疑这些功能在MySQL5.0中的成熟性。充其量它们在MySQL中被支持的时间也就一年左右,而在MySQL学习教程其他关系型数据库中则已经存在了近10年的时间。MySQLAB;翻译:陈朋奕
Introduction简介
MySQL5.0新特征教程是为必要懂得5.0版本新特征的MySQL老用户而写的。复杂的来讲是先容了“存储历程、触发器、视图、信息架构视图”,在此感激译者陈朋奕的勉力.
  但愿这本书能像熟行专家那样与您举行对话,用复杂的成绩、例子让你学到必要的常识。为了到达如许的目标,我会从每个细节入手下手渐渐的为人人创建观点,最初会给人人展现较年夜的有用例,在进修之前大概人人会以为这个用例很难,可是只需随着课程往学,信任很快就可以把握。
ConventionsandStyles商定和编程作风
  每次我想要演示实践代码时,我会对mysql客户真个屏幕就呈现的代码举行调剂,将字体改成Courier,使他们看起来与一般文本纷歧样。
  在这里举个例子:mysql>DROPFUNCTIONf;QueryOK,0rowsaffected(0.00sec)
  假如实例对照年夜,则必要在某些行和段落间加正文,同时我会用将“<--”标记放在页面的右侧以暗示夸大。
  比方:

mysql>CREATEPROCEDUREp()
->BEGIN
->/*Thisproceduredoesnothing*/<--
->END;//QueryOK,0rowsaffected(0.00sec)
  偶然候我会将例子中的"mysql>"和"->"这些体系显现往失落,你能够间接将代码复制到mysql客户端程序中(假如你如今所读的不是电子版的,能够在mysql.com网站下载相干剧本)以是的例子都已在Suse9.2linux、Mysql5.0.3大众版上测试经由过程。
  在您浏览本书的时分,Mysql已有更高的版本,同时能撑持更多OS了,包含Windows,Sparc,HP-UX。因而这里的例子将能一般的运转在您的电脑上。但假如运转仍旧呈现妨碍,能够征询你熟悉的资深Mysql用户,以失掉久长的撑持和匡助。
ADefinitionandanExample界说及实例
  界说及实例存储历程是一种存储在书库中的程序(就像正轨言语里的子程序一样),正确的来讲,MySQL撑持的“routines(例程)”有两种:一是我们说的存储历程,二是在其他SQL语句中能够前往值的函数(利用起来和Mysql预装载的函数一样,如pi())。我在本书内里会更常常利用存储历程,由于这是我们已往的习气,信任人人也会承受。
  一个存储历程包含名字,参数列表,和能够包含良多SQL语句的SQL语句集。
  在这里对部分变量,非常处置,轮回把持和IF前提句有新的语法界说。
  上面是一个包含存储历程的实例声明:(译注:为了便利浏览,今后的程序不添任何中文正文)

CREATEPROCEDUREprocedure1/*name存储历程名*/
(INparameter1INTEGER)/*parameters参数*/
BEGIN/*startofblock语句块头*/
DECLAREvariable1CHAR(10);/*variables变量声明*/
IFparameter1=17THEN/*startofIFIF前提入手下手*/
SETvariable1=birds;/*assignment赋值*/
ELSE
SETvariable1=beasts;/*assignment赋值*/
ENDIF;/*endofIFIF停止*/
INSERTINTOtable1VALUES(variable1);/*statementSQL语句*/
END/*endofblock语句块停止*/
  上面我将会先容你能够使用存储历程做的事情的一切细节。同时我们将先容新的数据库工具―触发器,由于触发器和存储历程的联系关系是一定的。
WhyStoredProcedures为何要用存储历程
  因为存储历程关于MySQL来讲是新的功效,很天然的在利用时你必要加倍注重。
  究竟,在此之前没有任何人利用过,也没有良多大批的有履历的用户来带你走他们走过的路。但是你应当入手下手思索把现有程序(大概在服务器使用程序中,用户自界说函数(UDF)中,或是剧本中)转移到存储过程当中来。如许做不必要缘故原由,你不能不往做。
  由于存储历程是已被认证的手艺!固然在Mysql中它是新的,可是不异功效的函数在其他DBMS中早已存在,而它们的语法往是不异的。因而你能够从其别人那边取得这些观点,也有良多你能够征询大概招聘的履历用户,另有很多第三方的文档可供你浏览。
  存储历程会使体系运转更快!固然我们临时不克不及在Mysql上证实这个上风,用户失掉的体验也纷歧样。我们能够说的就是Mysql服务器在缓存机制上做了改善,就像Preparedstatements(预处置语句)所做的那样。因为没有编译器,因而SQL存储历程不会像内部言语(如C)编写的程序运转起来那末快。可是提拔速率的次要办法却在于可否下降收集信息流量。假如你必要处置的是必要反省、轮回、多语句但没有效户交互的反复性义务,你就能够利用保留在服务器上的存储历程来完成。如许在实行义务的每步时服务器和客户端之间就没那末多的信息交往了。
  以是存储历程是可复用的组件!设想一下假如你改动了主机的言语,这对存储历程不会发生影响,由于它是数据库逻辑而不是使用程序。存储历程是能够移植的!当你用SQL编写存储历程时,你就晓得它能够运转在Mysql撑持的任何平台上,不必要你分外增加运转情况包,也不必要为程序在操纵体系中实行设置允许,大概为你的分歧型号的电脑存储历程将被保留!假如你编写好了一个程序,比方显现银行事物处置中的支票取消,那想要懂得支票的人就能够找到你的程序。
  它会以源代码的情势保留在数据库中。这将使数据和处置数据的历程成心义的联系关系这大概跟你在课上听到的计划论中说的一样。存储历程能够迁徙!
  Mysql完整撑持SQL2003尺度。某些数据库(如DB2、Mimer)一样撑持。但也有部分不撑持的,如Oracle、SQLServer不撑持。我们将会赐与充足匡助和工具,使为其他DBMS编写的代码能更简单转移到Mysql上。
SettingupwithMySQL5.0设置并入手下手MySQL5.0服务
  经由过程
  mysql_fix_privilege_tables
  大概
  ~/mysql-5.0/scripts/mysql_install_db
  来入手下手MySQL服务
  作为我们实习的筹办事情的一部分,我假定MySQL5.0已安装。假如没无数据库办理员为你安装好数据库和其他软件,你就必要本人往安装了。不外你很简单忘记一件事,那就是你必要有一个名为mysql.proc的表。
  在安装了最新版本后,你必需运转

mysql_fix_privilege_tables
  大概
mysql_install_db
  (只必要运转个中一个就够了)――否则存储历程将不克不及事情。我同时启用在root身份后运转一个非正式的SQL剧本,以下:
mysql>source/home/pgulutzan/mysql-5.0/scripts/mysql_prepare_privilege_tables_for_5.sql

StartingtheMySQLClient启动MySQL客户端
  这是我启动mysql客户真个体例。你大概会利用其他体例,假如你利用的是二进制版本大概是Windows体系的电脑,你大概会在其他子目次下运转以下程序:
easy@phpv:~>/usr/local/mysql/bin/mysql--user=root
WelcometotheMySQLmonitor.Commandsendwith;org.
YourMySQLconnectionidis1toserverversion:5.0.3-alpha-debug
Typehelp;orhforhelp.Typectoclearthebuffer.
  在演示中,我将会展现以root身份上岸后的mysql客户端前往的了局,如许意味着我有极年夜的特权。
CheckfortheCorrectVersion查对版本
  为了确认利用的MySQL的版本是准确的,我们要查询版本。我有两种办法确认我利用的是5.0版本:
SHOWVARIABLESLIKEversion;
or
SELECTVERSION();

  比方:
mysql>SHOWVARIABLESLIKEversion;
+---------------+-------------------+
|Variable_name|Value|
+---------------+-------------------+
|version|5.0.3-alpha-debug|
+---------------+-------------------+
1rowinset(0.00sec)
mysql>SELECTVERSION();
+-------------------+
|VERSION()|
+-------------------+
|5.0.3-alpha-debug|
+-------------------+
1rowinset(0.00sec)
  当瞥见数字5.0.x后就能够确认存储历程可以在这个客户端上一般事情。
TheSample"Database"示例数据库
  如今要做的第一件事是创立一个新的数据库然后设定为默许数据库完成这个步骤的SQL
  语句以下:
CREATEDATABASEdb5;
USEdb5;
  比方:
mysql>CREATEDATABASEdb5;
QueryOK,1rowaffected(0.00sec)
mysql>USEdb5;
Databasechanged
  在这里要制止利用有主要数据的实践的数据库然后我们创立一个复杂的事情表。
  完成这个步骤的SQL
  语句以下:
mysql>CREATEDATABASEdb5;
QueryOK,1rowaffected(0.01sec)
mysql>USEdb5;
Databasechanged
mysql>CREATETABLEt(s1INT);
QueryOK,0rowsaffected(0.01sec)
mysql>INSERTINTOtVALUES(5);
QueryOK,1rowaffected(0.00sec)
  你会发明我只在表中拔出了一列。如许做的缘故原由是我要坚持表的复杂,由于在这里其实不必要展现查询数据的技能,而是传授存储历程,不必要利用年夜的数据表,由于它自己已够庞大了。
  这就是示例数据库,我们将从这个名字为t的只包括一列的表入手下手PickaDelimiter选择分开符
如今我们必要一个分开符,完成这个步骤的SQL语句以下:
  DELIMITER//
  比方:
  mysql>DELIMITER//
  分开符是你关照mysql客户端你已完成输出一个SQL语句的字符或字符串标记。一向以来我们都利用分号“;”,但在存储过程当中,这会发生很多成绩,由于存储过程当中有很多语句,以是每个都必要一个分号因而你必要选择一个不太大概呈现在你的语句或程序中的字符串作为分开符。我曾用过双斜杠“//”,也有人用竖线“|”。我曾见过在DB2程序中利用“@”标记的,但我不喜好如许。你能够依据本人的喜欢来选择,可是在这个课程中为了更简单了解,你最好选择跟我一样。假如今后要恢复利用“;”(分号)作为分开符,输出上面语句就能够了:
"DELIMITER;//".
CREATEPROCEDUREExample创立程序实例
CREATEPROCEDUREp1()SELECT*FROMt;//
  大概这是你利用Mysql创立的第一个存储历程。假设是如许的话,最幸亏你的日志中记下这个主要的里程碑。
CREATEPROCEDUREp1()SELECT*FROMt;//<--
  SQL语句存储历程的第一部分是“CREATEPROCEDURE”:
CREATEPROCEDUREp1()SELECT*FROMt;//<--
  第二部分是历程名,下面新存储历程的名字是p1。
Digression:LegalIdentifiers题外话:正当标识符的成绩
  存储历程名对巨细写不敏感,因而‘P1’和‘p1’是统一个名字,在统一个数据库中你将不克不及给两个存储历程取不异的名字,由于如许将会招致重载。某些DBMS同意重载(Oracle撑持),可是MySQL不撑持(译者话:但愿今后会撑持吧。)。
  你能够接纳“数据库名.存储历程名”如许的折衷办法,如“db5.p1”。存储历程名能够分隔,它能够包含空格符,其长度限定为64个字符,但注重不要利用MySQL内建函数的名字,假如如许做了,在挪用时将会呈现上面的情形:
mysql>CALLpi();
Error1064(42000):Youhaveasyntaxerror.
mysql>CALLpi();
Error1305(42000):PROCEDUREdoesnotexist.
  在下面的第一个例子里,我挪用的是一个名字叫pi的函数,但你必需在挪用的函数名后加上空格,就像第二个例子那样。
CREATEPROCEDUREp1()SELECT*FROMt;//<--
  个中“()”是“参数列表”。
CREATEPROCEDURE
  语句的第三部分是参数列表。一般必要在括号内增加参数。例子中的存储历程没有参数,因而参数列表是空的―以是我只必要键进空括号,但是这是必需的。
CREATEPROCEDUREp1()SELECT*FROMt;//<--
"SELECT*FROMt;"
  是存储历程的主体。
  然后到了语句的最初一个部分了,它是存储历程的主体,是一样平常的SQL语句。历程体中语句
  "SELECT*FROMt;"
  包括一个分号,假如前面有语句停止标记(//)时能够不写这个分号。
  假如你还记得我把这部分叫做程序的主体将会是件功德,由于(body)这个词是人人利用的手艺上的术语。一般我们不会将SELECT语句用在存储过程当中,这里只是为了演示。以是利用如许的语句,能在挪用时更好的看出程序是不是一般事情。
未完待续...
与其他数据库相比,MySQL易学易用。

山那边是海 发表于 2015-1-18 18:53:17

数据库物理框架没有变动undo和redo都放在数据库得transaction中,个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个数据库,可能能在一定程度上避免I/O效率问题。

灵魂腐蚀 发表于 2015-1-27 18:10:42

一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。)

变相怪杰 发表于 2015-2-5 14:37:21

以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了,往往会有很多用户不会用了

精灵巫婆 发表于 2015-2-12 07:27:23

但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右)

深爱那片海 发表于 2015-3-3 01:20:24

习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQLServerManagementStudio的朋友使用。

飘灵儿 发表于 2015-3-11 08:47:36

比如,MicrosoftSQLServer2008的某一个版本可以满足现在的这个业务的需要,而且价格还比Oracle11g要便宜,那么这一产品就是适合的。

小女巫 发表于 2015-3-18 03:24:11

只能告诉你,学好数据库语言和原理,多见识几种数据库软件,比一棵树上吊死要好。

小魔女 发表于 2015-3-25 10:48:58

数据库物理框架没有变动undo和redo都放在数据库得transaction中,个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个数据库,可能能在一定程度上避免I/O效率问题。
页: [1]
查看完整版本: 绝无经由的MySQL 5.0新特征教程 存储历程:第一讲