日期:2011-05-02 15:20:00 来源:本站整理
MySQL中文参考手册6(MySQL与尺度的兼容性)对ANSISQL92扩大[MSSQL防范]
本文“MySQL中文参考手册6(MySQL与尺度的兼容性)对ANSISQL92扩大[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
MySQL中文参考手册6(MySQL与尺度的兼容性)wwww.iTbulo.comNLBAZ
转载 译者:晏子〖返回〗〖转发〗
q译者:晏子 (clyan@sohu.com)主页:http://linuxdb.yeah.net
5.2 以ANSI情势运行MySQL 假如你用--ansi选项启动mysqld,MySQL的下列行为改变.
5.3 MySQL相比ANSI SQL92的差别 我们尝试使得MySQL遵循ANSI SQL尺度和ODBC SQL尺度,但是在一些情形下,MySQL做一些差别的事情:
5.4 MySQL贫乏的功效 下列功效在当前的MySQL版本是没有的.关于一张优先级表指出什么时刻新扩大可以加入MySQL, 你应当咨询在线MySQL TODO 表.这是本手册最新的TODO表版本.见F 我们想要在将来加入到MySQL的事情列表(TODO). 5.4.1 子挑选 在MySQL中下列语句还不能工作: SELECT * FROM table1 WHERE id IN (SELECT id FROM table2); SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2); 但是,在很多情形下,你可以重写查询,而不用子挑选: SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id; SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id where table2.id IS NULL 关于更复杂的子查询,普通你可以成立暂时的表保存子查询.但是在一些情形下,这种挑选将行不通.最常常碰到的情形是DELETE语句,关于它尺度SQL不支持联合(join)(除了在子挑选).关于这种情形,有2个可用挑选,直到子挑选被MySQL支持. 第一个挑选是利用一种历程化的程序语言(比方Perl或PHP)来提交一个SELECT查询得到要被删除记录主键,并然后利用这些值构造DELETE语句(DELETE FROM ... WHERE ... IN (key1, key2, ...)). 第二个挑选是利用交互式SQL自动构造一套DELETE语句,利用MySQL扩大CONCAT()(替换尺度||操作符).比方: SELECT CONCAT('DELETE FROM tab1 WHERE pkid = ', tab1.pkid, ';') FROM tab1, tab2 WHERE tab1.col1 = tab2.col2; 你可以把这个查询放在一个脚本文件并且从它重定向输入到mysql号令行注释器,将其输出作为管道返回给注释器的第2个实例: prompt> mysql --skip-column-names mydb < myscript.sql | mysql mydb MySQL仅支持INSERT ... SELECT ...和REPLACE ... SELECT ...,独立的子挑选将大概在3.24.0得到,但是,在其他环境下,你目前可以利用函数IN(). 5.4.2 SELECT INTO TABLE MySQL还不支持Oracle SQL的扩大:SELECT ... INTO TABLE ....,相反MySQL支持ANSI SQL句法INSERT INTO ... SELECT ...,基本上他们是一样的. 别的,你可以利用SELECT INTO OUTFILE...或CREATE TABLE ... SELECT办理你的问题. 5.4.3 事件处理 不支持事件处理.MySQL将在短时间内支持原子(atomic)操作,它象没有回卷的事件.用原子操作,你能履行一组INSERT/SELECT/whatever 号令并且保证没有其他线程参与.在本文中,你普通不会需求回卷.目前,你可通过利用LOCK TABLES和UNLOCK TABLES号令禁止其他线程的干扰.见7.24 LOCK TABLES/UNLOCK TABLES句法. 5.4.4 存储历程和触发器 一个存储历程是能在服务器中编译并存储的一套SQL号令.一旦这样做了,顾客不需求一向重新发出全部查询,而可以参考存储历程.因为查询仅需一次词法解析并且较少的信息需求在服务器和客户之间传送,因此这供应了更好的性能.你与可以通过拥有在服务器中的函数库晋升概念上的层次. 一个触发器是当一个分外的事件发生时,被调用的一个存储历程.比方,你可以安装一个存储历程,它在每次从一个交易表删除一条记录时触发,并且当它全部交易被删除时,自动地从一个客户表中删除呼应的客户. 筹划改正的语言将能处理存储历程,但是没有触发器.触发器普通使每件事情变慢,即便对他们不需求的查询. 为了俩解什么时刻MySQL大概得到存储历程,见F 我们想在将来加入到MySQL的事情列表(TODO). 5.4.5 外键 注意,在SQL中外键不用于联合表,而主要用于查抄参考完好性(RI).假如你想要得到用一个SELECT语句从多个表得到后果, 你通过联合表做! SELECT * from table1,table2 where table1.id = table2.id; 见7.13 JOIN句法.见8.3.5 利用外键. 在MySQL里存在FOREIGN KEY句法仅仅为了与其他SQL供应商的CREATE TABLE号令相兼容;它不做任何事情.没有ON DELETE ...的FOREIGN KEY句法主要用于文档目的.一些ODBC利用程序可以利用它自动生成WHERE子句,但是这普通很简单的覆盖. FOREIGN KEY有时用作一个约束查抄,但是假如行以精确的次序被插入表,该查抄实际上是不必要的.MySQL仅仅支持这些子句(不考虑能否他们工作!),因为一些利用程序要求他们存在. 在MySQL中,你可以办理ON DELETE ...没被实现的问题,,在你从一个用外键的表删除记录时,通过为一个利用程序增添得当的DELETE语句便可.实际上,这很快(在一些情形下更快)并且比利用外键更比便于移植. 在不久的将来我们将扩大FOREIGN KEY实现,以便至少信息将在表阐明文件中保存并且可以由mysqldump和ODBC检索. 5.4.5.1 不利用外键的来由 有很多与FOREIGN KEY有关的问题我们不知道从哪儿开始:
FOREIGN KEY唯一好的方面是它给ODBC和一些其他客户程序查抄一张表若何被衔接的本领,并且利用它们显示出衔接图表并帮忙构造利用. MySQL不久将存储FOREIGN KEY定义以便一个客户能询问并收到本来的衔接若何举行的一个答案.当前的".frm 文件格局没有它应有的地位. 5.4.6 视图 MySQL不支持视图,但是它在TODO上. 5.4.7 '--'作为一个注释的开始 有些其他SQL数据库利用'--'开始注释.MySQL有"#"作为开始数注释的字符,即便mysql号令行工具删除以'--'开始的全部行.你也可以在MySQL中利用C注释气势/* this is a comment */.见7.29 注释句法. MySQL3.23.3和以上版本支持'--'注释气势,只要注释跟在一个空格之后.这是因为这种退化的注释气势已经惹起用像下列代码那样的自动生成的SQL查询的很多问题,这里我们自动地为!payment!插入支付值: UPDATE tbl_name SET credit=credit-!payment! 你想出当payment的值是负的时将发生什么吗? 因为1--1在SQL中是合理的,我们认为'--'开始注释是可怕的. 但是在MySQL 3.23中,你可以利用:1-- This is a comment 假如你正在运行一个比3.23早的MySQL的版本,下列的谈论才触及你: 假如你在一个文本文件中有一个SQL程序,它包含'--'注释,你应当利用: shell> replace " --" " #" < text-file-with-funny-comments.sql | mysql database 而不是普通: shell> mysql database < text-file-with-funny-comments.sql 你也可以"现场"编辑号令文件将'--'注释改成'#'注释: shell> replace " --" " #" -- text-file-with-funny-comments.sql 用这个号令改回他们: shell> replace " #" " --" -- text-file-with-funny-comments.sql 5.5 MySQL 遵守什么尺度? Entry level SQL92.ODBC level 0-2. 5.6 怎样处理没有COMMIT/ROLLBACK MySQL不支持COMMIT-ROLLBACK.问题是有效地处理COMMIT-ROLLBACK将需求完好差别于MySQL本日利用的表筹划.MySQL也将需求额外的线程在表上做自动排除工作,并且磁盘用量将更高.这将使MySQL比当今慢上大约2-4倍.MySQL比几近全部其他SQL数据库都快(普通至少快2-3倍).缘由之一就是贫乏COMMIT-ROLLBACK. 目前,我们是更多地实现SQL服务器语言(象存储历程),有了它,你将确切很少需求COMMIT-ROLLBACK,这也将得到更好的性能. 普通需求事件的循环可以借助LOCK TABLES举行编码,并且当你能当即地更新记录时,你不需求光标(cursor). 我们在TODO上有事件和光标,但是并非相当优先.假如我们实现这些,将作为CREATE TABLE的选项,那意味着COMMIT-ROLLBACK将仅工作在那些表上,以便速度丧失仅仅强加在那些表上. 我们在TcX有一个更大的需求,一个比100%通用数据库的真正快速的数据库.无论什么时刻我们发现一个办法来实现这些特点而没有任何速度丧失,我们将大概做它.暂时,有很多更重要的事情要做.查抄TODO,看我们此时若何将事情优先布列.(有的较高级别支持的客户可以改变它,因此事情是可以重新优先化的.) 当前的问题实际上是ROLLBACK,没有ROLLBACK,你能用LOCK TABLES做任何COMMIT行动.为了支持ROLLBACK,MySQL将必须被改变以存储全部的旧记录,假如发出ROLLBACK,它们被更新的并且将任何东西恢复到起点.关于简单的情形,这不是难做的 (当前isamlog可以用于此目的),但是为ALTER/DROP/CREATE TABLE实现ROLLBACK将是更艰难的. 避免利用ROLLBACK,你可以利用下列战略: 利用LOCK TABLES ...锁住全部你想要存取的数据库表. 测试条件. 假如一切无误,更新. 利用UNLOCK TABLES释放你的锁. 这普通比利用大概带ROLLBACK的交易是一个更快的办法,固然不老是这样.这个办理筹划不能处理的唯一情况是当某人在更新当中杀死线程时.在这种情形下,全部的锁将被释放,但是一些更改不能被履行. 你也可以使函数以单个操作更新记录.你能通过利用下列技术得到一个很有效率的利用程序: 相对他们的当前的值改正字段 仅仅更新那些实际上更改的字段 比方,当我们正在更新一些客户信息时,我们仅仅更新那些改变了的客户数据并只测试没有任何数据的改变,或数据取决于改变的数据,与本来的行相比改变了.关于改变了的数据的测试用WHERE子句在UPDATE语句中完成.假如记录没被更新,我们给客户一条消息:"你改变了的一些数据已被其他用户改变了",然后我们在一个窗口中显示新行对比旧行,因此用户能决意他该利用哪个版本的客户记录. 这给了我们近似于"列锁定"的东西,但是实际上乃至更好,因为我们仅仅更新某些列,利用相关于他们的当前值的值.这意味着典型的UPDATE语句看上去象这些一样东西: UPDATE tablename SET pay_back=pay_back+'relative change'; UPDATE customer SET customer_date='current_date', address='new address', phone='new phone', money_he_owes_us=money_he_owes_us+'new_money' WHERE customer_id=id AND address='old address' AND phone='old phone'; 正如你能看到的,这是很有效的并且就算其他客户已经改变了pay_back或money_he_owes_us列的也能工作. 在很多情形下,为管理一些表格的唯一标识符目的,用户已经想要ROLLBACK或LOCK TABLES.这可用一个AUTO_INCREMENT列和一个SQL函数LAST_INSERT_ID()或C API函数mysql_insert_id()更高效地处理.见20.4.29 mysql_insert_id(). 在TcX,我们历来没有任何对行级锁定的需求,因为我们老是能通过编码办理它.一些情形下需求确切行锁定,但是他们是很少见的.假如你想要行级锁定,你可以在表中利用标志列并且这样做: UPDATE tbl_name SET row_flag=1 WHERE id=ID; 假如行被找到发现并且row_flag在本来的行已经不是1,对受影响的行数MySQL返回1. 你可以想到它,因为MySQL把上面的查询变成: UPDATE tbl_name SET row_flag=1 WHERE id=ID and row_flag <> 1; ' wwww.iTbulo.comNLBAZ 责任编辑:eight(2001-06-07 00:45) |
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论