转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> MySql >> 正文
MySQL常见错误问答!(4)         ★★★★

MySQL常见错误问答!(4)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:725 更新时间:2009/4/22 20:12:54
18.16 alias问题 
你可以在GROUP BY、ORDER BY或在HAVING部分中使用别名引用列。别名也可以用来为列取一个更好点的名字: 
SELECT SQRT(a*b) as rt FROM table_name GROUP BY rt HAVING rt > 0; 
SELECT id,COUNT(*) AS cnt FROM table_name GROUP BY id HAVING cnt > 0; 
SELECT id AS "Customer identity" FROM table_name; 

注意,你的 ANSI SQL 不允许你在一个WHERE子句中引用一个别名。这是因为在WHERE代码被执行时,列值还可能没有终结。例如下列查询是不合法:SELECT id,COUNT(*) AS cnt FROM table_name WHERE cnt > 0 GROUP BY id; 

WHERE语句被执行以确定哪些行应该包括GROUP BY部分中,而HAVING用来决定应该只用结果集合中的哪些行。  


18.17 从关联的表中删除行 
因为MySQL不支持子选择或在DELETE语句中使用多个表,你应该使用下列方法从2个关联的表中删除行:  
在主表中基于某个WHERE条件SELECT行。  
在主表中基于相同的条件DELETE行。  
DELETE FROM related_table WHERE related_column IN (selected_rows)  
如果在related_column查询中的字符的全部数量超过1,048,576(缺省值max_allowed_packet),你应该分成更小的部分并且执行多个DELETE语句。如果related_column是一个索引,你每次只删除100-1000个related_column id将可能使得DELETE最快。如果related_column不是一个索引,速度与IN子句中参数的数量无关。 


18.18 解决没有匹配行的问题 
如果你有一个复杂的查询,涉及多个表,但没有返回任何行,你应该使用下列过程查找你的询问有什么不对:  
EXPLAIN测试查询并且检查你是否能找出显然是错误的一些东西。见7.22 EXPLAIN句法(得到关于一个SELECT的信息)。  
仅选择那些在WHERE子句中使用的字段。  
一次从查询中删除一个表,直到它返回一些行。如果表很大,对查询使用LIMIT 10是一个好主意。  
对应该已经匹配一行的列做一个SELECT,针对从询问中做后被删除的表。  
如果你将FLOAT或DOUBLE列与有小数的数字进行比较,你不能使用=!。这个问题在大多数计算机语言是常见的,因为浮点值不是准确的值。 
mysql> SELECT * FROM table_name WHERE float_column=3.5; 
   -> 
mysql> SELECT * FROM table_name WHERE float_column between 3.45 and 3.55; 

在大多数情况下,将FLOAT改成一个DOUBLE将修正它! 
如果你仍然不能发现错误是什么,创建一个最小的可运行mysql test < query.sql的测试来显示你的问题。你可以用mysqldump --quick database tables > query.sql创建一个测试文件,在一个编辑器编辑文件,删除一些插入行(如果有太多这些语句)并且在文件末尾加入你的选择语句。测试你仍然有问题,可以这样做: 
shell> mysqladmin create test2 
shell> mysql test2 < query.sql 

使用mysqlbug的邮寄测试文件到mysql@lists.mysql.com。 


18.19 与ALTER TABLE有关的问题 
如果ALTER TABLE死于这样一个错误: 
Error on rename of ’./database/name.frm’ to ’./database/B-a.frm’ (Errcode: 17) 

问题可能是MySQL在前一个ALTER TABLE中已经崩溃并且留下了一个名为“A-xxx”或“B-xxx”的老的数据库表。在这种情况下,到MySQL数据目录中并删除所有名字以A-或B-开始的文件。(你可以把他们移到别的地方而不是删除他们)。 
ALTER TABLE工作方式是:  
以要求的改变创建一个名为“A-xxx”的新表。  
从老表把所有行拷贝到“A-xxx”。  
老表被改名为“B-xxx”。  
“A-xxx”被改名为你的老表的名字。  
“B-xxx”被删除。  
如果某些改名操作出错,MySQL试图还原改变。如果出错严重(当然,这不应该发生。),MySQL可能留下了老表为“B-xxx”但是一个简单改名就应该恢复你的数据。 


18.20 怎样改变一张表中列的顺序 
SQL的要点是中抽象应用程序以避免数据存储格式。你应该总是以你想要检索数据的意愿指定顺序。例如: 
SELECT col_name1, col_name2, col_name3 FROM tbl_name; 

将以col_name1、col_name2、col_name3的顺序返回列,而: 
SELECT col_name1, col_name3, col_name2 FROM tbl_name;  

将以col_name1、col_name3、col_name2的顺序返回列。 
在一个应用程序中,你应该决不基于他们的位置使用SELECT * 检索列,因为被返回的列的顺序永远不能保证;对你的数据库的一个简单改变可能导致你的应用程序相当有戏剧性地失败。 
不管怎样,如果你想要改变列的顺序,你可以这样做:  
以正确的列顺序创建一张新表。  
执行INSERT INTO new_table SELECT fields-in-new_table-order FROM old_table.  
删除或改名old_table。  
ALTER TABLE new_table RENAME old_table


[MySql]PHP存取 Mysql 数据乱码终极解决方案  [MySql]解决Table xxx is marked as crashed and should …
[MySql][MySQL]快速解决"is marked as crashed and shoul…  [MySql]MySQL DELETE语法用法详解
[MySql]mysql中时间日期格式化  [MySql]修改mysql导入文件大小限制
[Web开发]指定资源下载失败msxml3.dll 错误 800c0008的解决…  [Web开发]"ActiveX部件不能创建对象"错误如何解决?
[其他]MySql常用命令大全  [Web开发]把ACCESS的数据导入到Mysql中的方法详解
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台