相同update语句在MySQL,Oracle的不同表现(r12笔记第30天)
今天有个朋友问我一个SQL问题,大体是一个update语句,看起来逻辑没有问题,但是执行的时候却总是报错。
语句和报错信息为:
UPDATE payment_data rr
SET rr.penalty_date = '2017-4-12'
where rr.id =
(SELECT min(r.id)
FROM payment_data r
where data_no =
(SELECT data_no
FROM user_debt
WHERE out_trade_no = 'bestpay_order_no1491812746329'));
ERROR 1093 (HY000): You can't specify target table 'rr' for update in FROM clause 对于这个问题,如果不想使用中间表,那么可以改写为下面的形式,就是中间做了一个包装来规避这个问题。
UPDATE payment_data rr
SET rr.penalty_date = '2017-4-12'
where rr.id =
(SELECT min(t.id)
FROM (select id,data_no from payment_data r) t
where t.data_no =
(SELECT data_no
FROM user_debt
WHERE out_trade_no = 'bestpay_order_no1491812746329')); 但是这个问题才是开始,我对比了一下在两个数据库的表现,还是有很大的差别,我们先在MySQL复现一下。
创建两个表如下:
create table payment_data(id int,data_no varchar(30), penalty_date date);
create table user_debt(out_trade_no varchar(30), data_no varchar(30));
在Oracle中数据类型稍有变化。
create table payment_data(id int,data_no varchar2(30), penalty_date date);
create table user_debt(out_trade_no varchar2(30), data_no varchar2(30));然后我会逐个运行下面的4个语句,同时标识在MySQL,Oracle的表现。
1)语句1
UPDATE payment_data rr
SET rr.penalty_date = '2017-4-12'
where rr.id =
(SELECT min(r.id)
FROM payment_data r
where data_no =
(SELECT data_no
FROM user_debt
WHERE out_trade_no = 'bestpay_order_no1491812746329'));
MySQL: 会报错,提示DML语句不能同时查询同一个表。
Oracle:无报错,可以正确解析和执行。
2)语句2
UPDATE payment_data rr
SET rr.penalty_date = '2017-4-12'
where rr.id =
(SELECT min(t.id)
FROM (select id,data_no from payment_data r) t
where t.data_no =
(SELECT data_no
FROM user_debt
WHERE out_trade_no = 'bestpay_order_no1491812746329'));
MySQL:执行成功
Oracle: 执行成功
3)语句3
UPDATE payment_data rr, (SELECT min(r.id) id
FROM payment_data r
where data_no =
(SELECT data_no
FROM user_debt
WHERE out_trade_no = 'bestpay_order_no1491812746329')) t
SET rr.penalty_date = '2017-4-12'
where rr.id =t.id;MySQL:能够正确执行
Oracle:解析出错
4)语句4
UPDATE payment_data rr
SET rr.penalty_date = '2017-4-12'
where rr.id =
(SELECT min(r.id)
FROM payment_data r
inner join user_debt b on r.data_no = b.data_no
WHERE b.out_trade_no = 'bestpay_order_no1491812746329');MySQL:执行失败
Oracle:执行正常
相同update语句在MySQL,Oracle的不同表现(r12笔记第30天)相关推荐
- update语句修改mysql密码_修改 mysql 密码
修改mysql密码的方法 use mysql update user set Password=password('newpassword') where User='root'; flush pri ...
- 一条update语句在MySQL内部是如何执行的
一.Server层阶段 1.连接器:负责跟客户端建立连接.获取权限.维持和管理连接 2.分析器:验证通过以后,分析器会对该语句分析, 判断是否语法有错误等. 3.优化器:选择索引,生成执行计划. 4. ...
- win7安装mysql5.7.16后,执行update语句导致mysql服务停止
碰到一个很怪异的问题,在win7环境将mysql5.6版本卸载,安装mysql5.7.16后,执行update语句时,导致mysql服务停止! 在linux环境下使用同样的库和执行同样的update语 ...
- oracle两条update语句怎么写,Oracle两表关联执行update语句代码
Oracle两表关联执行update时,因为没有像SqlServer的update from,因此要麻烦一些,通常有以下四种方式: 第一种:更新的条件为两个表的查询关联 update customer ...
- mysql批量更新,批量插入之replace语句/insert into... on duplicate key update语句
mysql批量更新/插入数据有以下方法,使用这些方法批量插入数据/更新数据的时候就不用在代码层次增加判断数据是否已存在的逻辑了. 1:replace语句 2: insert into... on du ...
- MySQL,Oracle系统学习,以及SQL语言-----数据库篇学习笔记
Handouts MySQL和Oracle系统学习 一. 开篇立意(~~~~必看,有说明~~~~) 二. Oracle 篇 数据库存在之意义 基础概念(必须看,后面不会说明!!!) Oracle管理系 ...
- InnoDB:一条update语句执行过程
存储引擎InnoDB下执行一条update的语句要经过哪些步骤呢?假设我们执行如下SQL,本文宏观上将执行器和存储引擎视为一体(执行器和存储引擎交互). update user_info set na ...
- MySQL这样写UPDATE语句,劝退
欢迎关注方志朋的博客,回复"666"获面试宝典 # 起因 最近,好几次有开发同学在钉钉上问我,比如下图: 问题归纳起来就是:在MySQL里面update一条记录,语法都正确的,但记 ...
- mysql里条件语句和循环语句_MySQL与Oracle 差异比较之四条件循环语句
循环语句 编号 类别 oracle Mysql 注释 1 IF语句使用不同 IFiv_weekly_day = 'MON'THEN ii_weekly_day := 'MON'; ELSIFiv_we ...
最新文章
- 教育部发文:AI、算法等2018年进入全国高中课程!
- -gMIS持续优化更新, +InSiteSearch站内搜索
- ssl_error_rx_record_too_long
- 【Matlab开发】MATLAB编译C/C++代码
- 程序员的毕业设计,时隔一年,仍感觉头秃
- 如何设置centos7的ip地址配置信息,让我的主机和它互Ping,以及远程登陆
- 27_线程安全操作及其案例
- stata 导出 相关系数表_【BBtime】戏说会计论文---stata简单实操
- Matlab 线性拟合 polyfit 结果不准/偏差很大
- android连接苹果蓝牙耳机,苹果蓝牙耳机怎么配对 苹果蓝牙耳机怎么配对安卓手机 苹果蓝牙耳机使用说明...
- 2022全球「高被引科学家」榜单出炉!中国内地1169人入选,继续紧追美国
- 小组取什么名字好_给小组取个好名字
- 修订歌词《仙剑》电视原声插曲《逍遥叹》
- 把鼠标指针换成自定义图片 傻瓜教程
- screenX、client X、pageX、offsetX、layerX
- DASCTFNepCTF 部分writeup
- 【古墓射手】隐私政策
- Hadoophbase监控页面未授权访问漏洞处理方案验证过程实现
- 解决手机连接不上电脑开的热点问题
- SL3037B 60V输入0.6A输出 非同步整流DCDC转换器 兼容SCT2601