使用mysql merge into 时遇到的mysql #1093错误的解决

2018年2月11日15:34:23

做PHP开发时,要写一个SQL语句。就是如果表中存在相应的记录时,就执行更新,不存在就执行插入。

记得以前做SQL SERVER时,有merge into 语句,可以按查询条件,选择要执行的操作,是插件还是更新。但是mysql好像没这个功能。它是按主键是是否存在进行辨别的。

所以习惯性地写了如下语句:

INSERT INTO readbook (readid,readpage,readcount,bookid,userid,readtime) VALUES ( (SELECT  readid From readbook where
userid=1 and bookid=1 and readpage=5),5,1,1,1,now()) ON duplicate key UPDATE 

readcount=readcount + 1,readtime=now()

结果提示错误,如下:

静态分析:

分析时发现11个错误。

Unrecognized keyword. (near "key" at position 185)
Unexpected token. (near "=" at position 209)
Unexpected token. (near "readcount" at position 210)
Unexpected token. (near "+" at position 220)
Unexpected token. (near "1" at position 222)
Unexpected token. (near "," at position 223)
Unexpected token. (near "readtime" at position 224)
Unexpected token. (near "=" at position 232)
Unrecognized keyword. (near "now" at position 233)
Unexpected token. (near "(" at position 236)
Unexpected token. (near ")" at position 237)
SQL 查询: 文档

INSERT INTO readbook (readid,readpage,readcount,bookid,userid,readtime) VALUES ( (SELECT readid From readbook where userid=1 and bookid=1 and readpage=5) ,5,1,1,1,now()) ON duplicate key UPDATE readcount=readcount + 1,readtime=now()

MySQL 返回: 文档

#1093 - You can‘t specify target table ‘readbook‘ for update in FROM clause

error code

于是更改语句:

INSERT INTO readbook (readid,readpage,readcount,bookid,userid,readtime) VALUES ( (SELECT * from (SELECT readid From readbook where userid=1 and bookid=1 and readpage=5) as a ),5,1,1,1,now()) ON duplicate key UPDATE readcount=readcount + 1,readtime=now()

提示插入成功。

之所以能成功是因为,1093错误为:但修改一个表的时候子查询不能是同一个表,解决办法:把子查询再套一层,变成原来表的孙子查询就可以了

其实,这个过程中,由于对Mysql不熟悉,我还遇到了其它很多问题。

比如

(SELECT * from (SELECT readid From readbook where userid=1 and bookid=1 and readpage=5) as a

必须有 as a ,因为必须给表起个别名,但我以前使用SQL SERVER时,没这个要求。

还有就是,原来我还这么写过

INSERT INTO readbook (readid,readpage,readcount,bookid,userid,readtime) VALUES ( (SELECT 

CASE WHEN a.readid>0 THEN a.readid ELSE NULL END from(SELECT readid From readbook where 

userid=1 and bookid=1 and readpage=3) as a) ,3,1,1,1,now()) ON duplicate key UPDATE 

readcount=readcount + 1,readtime=now()

后来逐渐尝试,发现这个CASE WEHN是没有必要的,貌似MYSQL能自动把查不到结果的值,以默认值代替。

原文地址:https://www.cnblogs.com/zwl24/p/8442222.html

时间: 2024-08-28 14:49:11

使用mysql merge into 时遇到的mysql #1093错误的解决的相关文章

Nodejs发送Post请求时出现socket hang up错误的解决办法

参考nodejs官网发送http post请求的方法,实现了一个模拟post提交的功能.实际使用时报socket hang up错误. 后来发现是请求头设置的问题,发送选项中需要加上headers字段信息(这个估计也和对方的服务器有关,对于不完成的post请求头,可能被丢弃了). 完整的代码如下(遇到类型问题的同学可以做个参考): var querystring = require('querystring') , http = require('http'); var data = query

yum安装软件包时出现Transaction Check Error:错误的解决方法

[[email protected] ~]# yum install ipa-server Transaction Check Error:  file /usr/share/man/man3/XML::SAX::Base.3pm.gz conflicts between attempted installs of perl-XML-SAX-0.96-7.el6.noarch and perl-XML-SAX-Base-1.04-1.el6.rf.noarch  file /usr/share/

MySQL远程连接时出现10061以及1045错误时的解决方法

以前对于MySQL数据库的管理基本都是在本地,今天了解到一个比较轻便,不需安装,直接解压可用的图形界面管理工具HeidiSQL(下载地址:链接:http://pan.baidu.com/s/1nvuP2Et 密码:vry9),界面非常简洁. 1)解决10061问题 本人在按照提示进行远程连接Linux系统下的MySQL数据库时,首先遇到的是下面的问题: 图1: '10061'问题 于是乎,按照提示的错误代码查找资料,网上很多平台都说是MySQL的权限问题,需要对root用户赋予足够权限,能够允许

MYSQL报Fatal error encountered during command execution.错误的解决方法

{MySql.Data.MySqlClient.MySqlException (0x80004005): Fatal error encountered during command execution. ---> MySql.Data.MySqlClient.MySqlException (0x80004005): Fatal error encountered attempting to read the resultset. ---> MySql.Data.MySqlClient.MyS

windows下mysql主从同步时从服务器出现表已经存在解决办法

问题如下: mysql> show slave status \G*************************** 1. row ***************************               Slave_IO_State:                  Master_Host: 172.168.3.190                  Master_User: slave                  Master_Port: 12148         

MySQL安装过程中出现“APPLY security settings错误”的解决方式

***********************************************声明****************************************************** 原创作品,出自 "晓风残月xj" 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj). 因为各种原因.可能存在诸多不足,欢迎斧正. *******************************************

ASP.NET中使用UpdatePanel时用Response输出出现错误的解决方法

asp.net中执行到Response.write("xx");之类语句或Microsoft JScript 运行时错误: Sys.WebForms.PageRequestManagerParserErrorException: 无法分析从服务器收到的消息.之所以出现此错误,常见的原因是: 在通过调用 Response.Write() 修改响应时,将启用响应筛选器.HttpModule 或服务器跟踪.   在放置了UpdatePanel时,先在</UpdatePanel>前

IIS发布网站时,遇到服务器500错误的解决办法

在我发布网站的时候,遇到服务器500 经过一番百度和确认之后,对于新发布的文件在绑定了IIS网站时 需要在服务器文件根目录中设置对于该文件内容的安全控制 即添加一个everyone用户,并指定完全控制权后消除了服务器500 原文地址:https://www.cnblogs.com/sandaman2019/p/11273420.html

使用maven时出现Failure to transfer 错误的解决方法

在eclipse里使用maven,连接nexus私服. 添加依赖之后,总是报添加的依赖jar文件找不到,但是在nexus的库里面能找到这个依赖的jar文件,但是在本地的maven库里面找不到,于是我将本地库里面这个依赖对应的文件夹删掉,然后在eclipse里面执行update dependencies.成功解决问题! 右键单击项目->maven->update dependencies. 引起的原因是由于本地库从nexus中请求jar文件,如果私服中不存在则取网上下载,如果网速过慢,下载时间超