大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 数据库 -> MySQL -> MySQL常见错误问答!

MySQL常见错误问答!

时间: 2021-08-13 作者:daque

18.2.1 mysql server has gone away缺点 本末节也波及相关lost connection to server during query的缺点。 对mysql server has gone away缺点最罕见的因为是效劳器超时了而且封闭了贯穿。缺省级地区级,即使没有工作爆发,效劳器在 8个钟点后封闭贯穿。你可在启用mysqld时经过树立wait_timeout变量变换功夫控制。 你不妨经过实行mysqladmin version而且检查平常运转的功夫来查看mysql还没死掉。 即使你有一个剧本,你只须再发出查问让客护举行一次机动的从新贯穿。 在这种请下,你常常能赢得下列缺点代码(你获得的是os关系的): cr_server_gone_error 存户不许发送一个题目给效劳器。  cr_server_lost 当写效劳器时,存户没有堕落,然而它没有获得对题目的一个完备的谜底(或任何谜底)。  即使你向效劳器发送不精确的或太大的查问,你也大概获得那些缺点。即使mysqld获得一个太大或不平常的包,它觉得存户堕落了并封闭贯穿。即使你须要较大的查问(比方,即使你正在处置较大的blob列),你不妨运用-o max_allowed_packet=#选项(缺省1m)启用mysqld以减少查问控制。过剩的外存按需调配,如许mysqld惟有在你发出较大差询时或mysqld必需归来较大的截止行时,才运用更多的外存! 18.2.2 can’t connect to [local] mysql server缺点 一个mysql存户不妨两种各别的办法贯穿mysqld效劳器:unix套接字,它经过在文献体例中的一个文献(缺省“/tmp/mysqld.sock”)举行贯穿;或tcp/ip,它经过一个端标语贯穿。unix套接字比tcp/ip更快,然而只有效在贯穿同一台计划机上的效劳器。即使你不指定长机名或即使你指定特出的长机名localhost,运用unix套接字。 缺点(2002)can’t connect to ...常常表示着没有一个mysql效劳器运转在体例上或当试图贯穿mysqld效劳器时,你正在运用一个缺点的套接字文献或tcp/ip端口。  由查看(运用ps)在你的效劳器上有一个名为mysqld的过程启用!即使没有任何mysqld进程,你该当启用一个。见4.15.2 启用mysql效劳器的题目。 即使一个mysqld进程正在运转,你不妨经过试验那些各别的贯穿来查看效劳器(固然,端标语和套接字路途名大概在你的安置中是各别的): shell> mysqladmin version shell> mysqladmin variables shell> mysqladmin -h `hostname` version variables shell> mysqladmin -h `hostname` --port=3306 version shell> mysqladmin -h ’ip for your host’ version shell> mysqladmin --socket=/tmp/mysql.sock version 提防hostname吩咐运用反引号“`”而非正引号“’”;那些引导hostname输入(即,暂时长机名)被包办进mysqladmin吩咐中。 这是大概形成can’t connect to local mysql server缺点的少许因为:  mysqld不在运转。  你正在运用mit-pthreads的一个体例上运转。即使正在运转在一个没有原生线程的体例上,mysqld运用 mit-pthreads 软硬件包。见4.2 由mysql扶助的操纵体例。但是,mit-pthreads不扶助unix套接字,所以当与效劳器贯穿时,在如许一个体例上,你老是必需精确地指定长机名。试试运用这个吩咐查看到效劳器的贯穿: shell> mysqladmin -h `hostname` version 或人简略了mysqld运用的unix套接字(缺省“/tmp/mysqld.sock”)。你大概有一个cron工作简略了mysql套接字(比方,一个把旧文献从“/tmp”目次中简略的工作)。你老是不妨运转mysqladmin version而且查看mysqladmin正在试图运用的套接字真实生存。在这种情景下,建设本领是简略cron工作而不简略“mysqld.sock 或将套接字放在其余场合。你能用这个吩咐在mysql摆设时指定一个各别的套接字场所: shell> ./configure --with-unix-socket-path=/path/to/socket 你也不妨运用--socket=/path/to/socket选项启用safe_mysqld和在启用你的mysql存户前树立情况变量mysql_unix_port为套接字路途名。你可用--socket=/path/to/socket选项启用mysqld效劳器。即使你变换了效劳器的套接字路途名,你也必需报告mysql存户对于新路途的情景。你不妨经过树立情况变量mysql_unix_port为套接字路途名或由供给套接字路途名动作存户的参数做到。你可用这个吩咐尝试套接字: shell> mysqladmin --socket=/path/to/socket version 你正在运用 linux和线程仍旧死了(中心倾倒了)。在这种情景中,你必需杀死其它mysqld线程(比方在启用一个新的mysql效劳器之前,不妨用mysql_zap剧本)。见18.1 即使mysql老是解体如何办。  即使你获得缺点can’t connect to mysql server on some_hostname,你不妨试验下列办法找到题目是什么:  经过实行telnet your-host-name tcp-ip-port-number而且按几次回车来查看效劳器能否平常运转。即使有一个mysql运转在这个端口上,你该当获得一个包括正在运转的mysql效劳器的本子号的应答。即使你获得一致于telnet: unable to connect to remote host: connection refused的一个缺点,那么没有效劳器在运用的端口上运转。  试验贯穿当地呆板上的mysqld保护过程,并用mysqladmin variables查看mysqld被摆设运用的tcp/ip端口(变量port)。  查看你的mysqld效劳器没有效--skip-networking选项启用。  18.2.3 host ’...’ is blocked缺点 即使你获得象如许的一个缺点: host ’hostname’ is blocked because of many connection errors. unblock with ’mysqladmin flush-hosts’ 这表示着,mysqld仍旧获得了洪量(max_connect_errors)的长机’hostname’的在半途被阻碍了的贯穿乞求。在max_connect_errors次波折乞求后,mysqld认定堕落了(象来字一个黑客的报复),而且遏止该站点进一步的贯穿,直到或人实行吩咐mysqladmin flush-hosts。 缺省级地区级,mysqld在10个贯穿缺点后阻碍一台长机。你不妨经过象如许启用效劳器很简单地安排它: shell> safe_mysqld -o max_connect_errors=10000 & 提防,对给定的长机,即使获得这条缺点动静,你该当开始查看该长机的tcp/ip贯穿有没有题目。即使你的tcp/ip贯穿不在运转,减少max_connect_errors变量的值对你也不会有扶助! 18.2.4 too many connections缺点 即使在你试土贯穿mysql时,你获得缺点too many connections,这表示着仍旧有max_connections个存户贯穿了mysqld效劳器。 即使你须要比缺省(100)更多的贯穿,那么你该当重启mysqld,用更大的 max_connections 变量值。 提防,mysqld本质上承诺(max_connections+1)个存户贯穿。结果一个贯穿是为一个用process权力的用户保持的。经过不把这个权力给普遍用户(她们不该当须要它),有这个权力一个处置员不妨登录而且运用show processlist找到什么大概堕落。见7.21 show句法(获得表,列的消息)。 18.2.5 out of memory缺点 即使你发出查问而且获得一致于底下的缺点:  mysql: out of memory at line 42, ’malloc.c’ mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k) error 2008: mysql client ran out of memory 提防,缺点指向了mysql存户mysql。这个缺点的因为很大略,存户没有充满的外存保存十足截止。 为了矫正这个题目,开始查看你的查问能否精确。它该当归来这么多的行,这有理吗?即使是如许,你不妨运用mysql --quick,它运用mysql_use_result()检索截止汇合。这将较少的承担放在了存户端(不过效劳器更多)。 18.2.6 packet too large缺点 当一个mysql存户或mysqld效劳器获得一个比max_allowed_packet个字节长的包,它发出一个packet too large缺点并中断贯穿。 即使你正在运用mysql存户,你不妨经过用mysql --set-variable=max_allowed_packet=8m指定一个更大的缓冲区来启用存户步调。 即使你正在运用不承诺你指定最大包巨细的其余存户(比方 dbi),你须要在你启用效劳器时树立包巨细。你不妨运用mysqld的吩咐行选项树立max_allowed_packet为一个更大的尺寸。比方,即使你正憧憬将一个全长的blob惠存一张表中,你将须要用--set-variable=max_allowed_packet=24m选项来启用效劳器。   18.2.7 the table is full缺点 这个缺点爆发在外存偶尔表变得比tmp_table_size字节大时。为了制止这个题目,你不妨运用mysqld的-o tmp_table_size=#选项来减少偶尔表的巨细,或在你发出有疑义的查问之前运用sql选项sql_big_tables。见7.25 set option句法。 你也不妨运用--big-tables选项启用mysqld。这与为一切查问运用sql_big_tables实足沟通。[page_break]18.2.8 commands out of sync in client缺点 即使你在你的存户代码中获得commands out of sync; you can’t run this command now,你正在以缺点的步骤挪用存户因变量! 这大概爆发,比方,即使你正在运用mysql_use_result()而且在你仍旧挪用了mysql_free_result()之前试图实行新查问。即使你在mysql_use_result()或mysql_store_result()之间试图实行归来数据的2个查问,它也大概爆发。 18.2.9 ignoring user缺点 即使你获得下列缺点:  found wrong password for user: ’some_user@some_host’; ignoring user  这表示着在mysqld启用时或在它再次承载权力表时,它在user表中找到了一个有一个失效口令的条件。截止,条件大略地被权力体例忽视。 大概引导这个题目的因为和矫正:  你大概正在运转一个有一个老的user表的新本子mysqld。你不妨经过实行mysqlshow mysql user看看口令字段能否少于 16个字符来查看它。即使是如许,你不妨经过运转scripts/add_long_password剧本矫正这种情景。  用户有一个旧式的口令(8个字符长)而且你没运用--old-protocol选项启用mysqld。用一个新口令革新在user表中的用户或用--old-protocol重启mysqld。  你没有运用password()因变量到处user表中指定了一个口令。运用mysql以一个新口令革新在user表中的用户。保证运用password()因变量: mysql> update user set password=password(’your password’)            where user=’xxx’; 18.2.10 table ’xxx’ doesn’t exist缺点 即使你获得缺点table ’xxx’ doesn’t exist或can’t find file: ’xxx’ (errno: 2),这表示着在暂时数据库中没驰名为xxx的表生存。 提防,由于mysql运用目次和文献保存数据库和表,数据库和表名件是辨别巨细写的!(在win32上,数据库和表名不是辨别巨细写的,然而在查问中对一切表的援用必需运用沟通的巨细写!) 你不妨用show tables查看你在暂时数据库中有哪个表。见7.21 show句法(获得表、列的消息)。  18.3 mysql还好吗处置一个溢出的磁盘 当展示一个磁盘溢出的情景时,mysql做下列工作:  它每秒钟查看一次看能否有充满空间写入暂时行。即使有充满的空间,它连接犹如爆发什么工作。  每6秒钟它将相关磁盘溢出的劝告写入日记文献。  为了平静这个题目,你不妨采用下列动作:  连接,你只需开释充满的清闲磁盘空间再不插入一切记载。  停止线程,你必需发一个mysqladmin kill到线程。鄙人一次查看磁盘时,线程将被停止(在1秒钟内)。  提防,其余线程大概正在等候惹起“磁盘溢出”前提的表。即使你有几个“锁定的”的线程,杀死正在等候磁盘溢出前提的谁人线程将承诺其余线程连接。  18.4 怎样从一个文本文献运转sql吩咐 普遍地,mysql存户被交互性地运用,象如许: shell> mysql database 但是,也不妨把你的sql吩咐放在一个文献中而且报告mysql从该文献读取其输出。要想如许做,创作一个文本文献“text_file”,它包括你想要实行的吩咐。而后如次那么挪用mysql: shell> mysql database < text_file 你也能启用有一个use db_name语句的文本文献。在这种情景下,在吩咐行上指定命据库名是不需要的: shell> mysql < text_file 见12.1 各别的mysql步调概括。  18.5 mysql在哪儿保存偶尔文献 mysql运用tmpdir情况变量的值动作保存偶尔文献的目次的路途名。即使你没有树立tmpdir,mysql运用体例缺省值,它常常是“/tmp”或“/usr/tmp”。即使包括你的偶尔文献目次的文献体例太小,你该当编纂safe_mysqld设定tmpdir指向你有充满空间的一个文献体例!你也不妨运用mysqld的--tmpdir选名目树立偶尔目次。 mysql以“隐含文献”创造一切偶尔文献。这保护了即使mysqld被中断,偶尔文献也将被简略。运用隐含文献的缺陷是你将看得见一个大的偶尔文献填满了偶尔文献目次地方的文献体例。 当排序(order by或group by)时,mysql常常运用一个或两个偶尔文献。最大磁盘空间需要是: (保存货色的长度 + sizeof (数据库南针)) * 配合的行数 * 2 sizeof(数据库南针)常常是4,然而在将来对真实很大的表大概减少。 对少许select查问,mysql也创造偶尔sql表。那些没被隐含且有“sql_*”方法的名字。 alter table和optimize table在原数据库表的同一个目次中创造一张偶尔表。 18.6 还好吗养护“/tmp/mysql.sock ”不被简略 即使你有这个题目,究竟就任何人不妨简略mysql通信套接字“/tmp/mysql.sock”,在unix的大普遍本子上,你能经过为其树立sticky(t)位来养护你的“/tmp”文献体例。动作root登录而且做下列工作: shell> chmod +t /tmp 这将养护你的“/tmp”文献体例使得文献仅能由她们的一切者或超等用户(root)简略。 你能实行ls -ld /tmp查看sticky位能否被树立,即使结果一位承诺位是t,该位被树立了。 18.7 access denied缺点 见6.6 权力体例怎样处事。而且更加要看6.13 惹起access denied缺点的因为。  18.8 还好吗动作一个普遍用户运转mysql mysql效劳器mysqld能被任何用户启用并运转。为了将mysqld改由unix用户user_name来运转,你必需做下列工作:  即使它正在运转,遏止效劳器(运用mysqladmin shutdown)。  变换数据库目次和文献再不user_name有权力读和写文献(你大概须要动作unix的root用户本领做到): shell> chown -r user_name /path/to/mysql/datadir 即使在mysql数据目次中的目次或文献是标记链接,你也将须要顺着那些链接并变换她们指向的目次和文献。chown -r不许伴随标记链接。 以user_name用户启用效劳器,或即使你正在运用mysql 3.22或此后本子,以unix root用户启用mysqld并运用--user=user_name选项,mysqld将在接收任何贯穿之前切换到以unix user_name用户运转。  即使在体例被从新启用时,你运用mysql.server剧本启用mysqld,你该当编纂mysql.server用su以用户user_name运转mysqld,或运用--user选项挪用mysqld。(不变换safe_mysqld是需要的。)  此刻,你的mysqld过程该当正在动作unix用户user_name运转,并运转完备。纵然有一件工作没有变革:权力表的实质。缺省 地(就在运转了剧本mysql_install_db安置的权力表后),mysql用户root是独一有存取mysql数据库或创造或唾弃数据库权力的用户。只有你变换了那些权力,要不她们仍旧维持。当你动作一个unix用户而不是root登录时,这不该当遏止你动作mysql root用户来存取mysql;只有为存户步调指定-u root的选项。 提防经过在吩咐行上供给-u root,动作root存取mysql,与动作unix root用户或其余unix用户运转mysql没相关系。mysql的存取权力和用户名与unix用户名字是实足划分的。独一与unix用户名相关的是,即使当你挪用一个存户步调时,你不供给一个-u选项,存户将试图运用你的unix登录名动作你的mysql用户名举行贯穿。 即使你的unix呆板自己不安定,你大概该当起码在存取表中为mysql root用户放上一个口令。要不,在那台呆板上有一个帐号的任何用户能运转mysql -u root db_name而且做他爱好做的任何工作。[page_break]18.9 还好吗从新树立一个忘怀的口令 即使你忘怀了mysql的root用户的口令,你不妨用下列进程回复它。  经过发送一个kill(不是kill -9)到mysqld效劳器来封闭mysqld效劳器。pid 被生存在一个.pid文献中,常常在mysql数据库目次中: kill `cat /mysql-data-directory/hostname.pid` 你必需是一个unix root用户或运转效劳器的沟通用户做这个。 运用--skip-grant-tables选项重启mysqld。  用mysql -h hostname mysql贯穿mysqld效劳器而且用一条grant吩咐变换口令。见7.26 grant和revoke句法。你也不妨用mysqladmin -h hostname -u user password ’new password’ 举行。  用mysqladmin -h hostname flush-privileges或用sql吩咐flush privileges来承载权力表。  18.10 文献承诺权力题目 即使你有与文献承诺相关的题目,比方,即使当你创造一张表时,mysql发出下列缺点动静:  error: can’t find file: ’path/with/filename.frm’ (errcode: 13)  那么大概是在mysqld启用时,情况变量umask大概树立不精确。缺省的umask值是0660。你不妨如次启用safe_mysqld变换其动作: shell> umask=384  # = 600 in octal shell> export umask shell> /path/to/safe_mysqld & 18.11 文献没找到 即使你从mysql获得error ’...’ not found (errno: 23), can’t open file: ... (errno: 24)或任何其余有errno 23或errno 24的缺点,它表示着,你没成器mysql调配充满的文献刻画符。你能运用perror适用步调获得缺点号含意是什么的刻画: shell> perror 23 file table overflow shell> perror 24 too many open files 这边的题目是mysqld正在试图同声维持翻开太多的文献。你也不妨报告mysqld一次不翻开那么多的文献,或减少mysqld可获得的文献刻画符数目。为了报告mysqld一次维持翻开更少的文献,你不妨经过运用safe_mysqld的-o table_cache=32选项(缺省值是64)使表缓冲更小。减小max_connections值也将缩小翻开文献的数目(缺省值是90)。 要想变换mysqld可用的文献刻画符数目,窜改safe_mysqld剧本。剧本中有一条解释了的行ulimit -n 256。你不妨简略’#’字符往返掉该行的解释,而且变换数字256变换为mysqld可用的文献刻画符的数目。 ulimit能减少文献刻画符的数目,然而只能到操纵体例强加的控制。即使你须要减少每个过程可用的文献刻画符数目的os控制,拜见你的操纵体例文书档案。提防,即使你运转tcsh外壳,ulimit将不处事!当你乞求暂时控制时,tcsh也将汇报不精确的值!在这种情景下,你该当用sh启用safe_mysqld! 18.12 运用date列的题目 一个date值的方法是’yyyy-mm-dd’。按照ansi sql,不承诺其余方法。你该当在update表白式和select语句的where子句中运用这个方法。比方: mysql> select * from tbl_name where date >= ’1997-05-05’; 为了简单,即使日子用在数字左右文,mysql机动变幻一个日子到一个数字(而且反过来也如许)。当革新时和将一个日子与timestamp、date或datetime列比拟的一个where子句中,也是充满精巧以承诺一种“宽松”的字符串方法。(宽松方法表示着任何圈点字符用作在元件之间的分隔符。比方,’1998-08-15’和’1998#08#15’是等价的。)mysql也能变幻不包括分隔符的一个字符串(比方 ’19980815’),即使它动作一个日子说得通。特出日子’0000-00-00’不妨动作’0000-00-00’被保存和检索。当经过myodbc运用一个’0000-00-00’日子时,在myodbc 2.50.12和之上本子,它将机动被变换为null,由于odbc不许处置这种日子。 由于mysql举行了上述的变幻,下列语句不妨处事: mysql> insert into tbl_name (idate) values (19970505); mysql> insert into tbl_name (idate) values (’19970505’); mysql> insert into tbl_name (idate) values (’97-05-05’); mysql> insert into tbl_name (idate) values (’1997.05.05’); mysql> insert into tbl_name (idate) values (’1997 05 05’); mysql> insert into tbl_name (idate) values (’0000-00-00’); mysql> select idate from tbl_name where idate >= ’1997-05-05’; mysql> select idate from tbl_name where idate >= 19970505; mysql> select mod(idate,100) from tbl_name where idate >= 19970505; mysql> select idate from tbl_name where idate >= ’19970505’; 但是,下列将不处事:  mysql> select idate from tbl_name where strcmp(idate,’19970505’)=0; strcmp()是字符串因变量,所以它将idate变换为一个字符串而且实行字符串比拟。它不将’19970505’变换为一个日子并实行日子比拟。 提防,mysql不查看日子能否精确。即使你保存一个不精确的日子,比方’1998-2-31’,缺点的日子将被保存。即使日子不许被变幻就任何有理的值,在date字段中保存一个0。这主假如一个速率题目而且咱们觉得查看日子是运用步调的负担,而不平务器。 18.13 时区题目 即使你有一个题目,select now()以gmt功夫归来值而不是你的当地功夫,你必需设定tz情况变量为你的暂时时区。这该当在效劳器运转的情况举行,比方在safe_mysqld或mysql.server中。 18.14 在探求中的巨细写敏锐性 缺省级地区级,mysql探求是巨细写不敏锐的(纵然有少许字符集历来不是忽视巨细写的,比方捷克语)。这表示着,即使你用col_name like ’a%’搜罗,你将获得一切以a或a发端的列值。即使你想要使这个探求巨细写敏锐,运用象index(col_name, "a")=0查看一个前缀。或即使列值必需真实是"a",运用strcmp(col_name, "a") = 0。 大略的比拟操纵(>=、>、= 、< 、<=、排序和会合)是鉴于每个字符的“排序值”。有同样排序值的字符(象e,e和’e)被视为沟通的字符! like比拟在每个字符的小写值长进行(e==e 然而e<>’e)。 即使你想要一个列老是被看成巨细写敏锐的办法,证明它为binary。见7.7 create table句法。 即使你运用以所谓的big5源代码的华文数据,你要使一切的字符列是binary,它可行,是由于big5源代码字符的排序程序鉴于 ascii代码的程序。 18.15 null值题目 null值的观念是形成sql的生人的污染的一致因为,她们常常觉得null是和一个空字符串’’的一律的货色。不是如许的!比方,下列语句是实足各别的: mysql> insert into my_table (phone) values (null); mysql> insert into my_table (phone) values (""); 两个语句把值插入到phone列,然而第一个插入一个null值而第二个插入一个空字符串。第一个的含意不妨觉得是“电话号子不领会”,而第二个则可表示着“她没有电话”。  在sql中,null值在乎任何其余值以至null值比拟时老是假的(false)。包括null的一个表白式老是爆发一个null值,只有在包括在表白式中的演算符和因变量的文书档案中指出。鄙人列例子,一切的列归来null: mysql> select null,1+null,concat(’invisible’,null); 即使你想要探求值是null的列,你不许运用=null尝试。下列语句不归来任何行,由于对任何表白式,expr = null是假的: mysql> select * from my_table where phone = null; 要想探求null值,你必需运用is null尝试。下例表露怎样找到null电话号子和空的电话号子: mysql> select * from my_table where phone is null; mysql> select * from my_table where phone = ""; 在mysql中,就像很多其余的sql效劳器一律,你不许索引不妨有null值的列。你必需证明如许的名列not null,并且,你不许插入null到索引的列中。当用load data infile读取数据时,空驶列车用’’革新。即使你想要在一个列中有null值,你该当在文本文献中运用\n。字面词’null’也不妨在某些景象下运用。见7.16 load data infile句法。当运用order by时,开始表露null值。即使你用desc以降序排序,null值结果表露。当运用group by时,一切的null值被觉得是十分的。为了无助于于null的处置,你能运用is null和is not null演算符和ifnull()因变量。 对某些列典型,null值被特出地处置。即使你将null插入表的第一个timestamp列,则插入暂时的日子和功夫。即使你将null插入一个auto_increment列,则插入程序中的下一个数字。[page_break]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。 

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.