日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

相同update语句在MySQL,Oracle的不同表现(r12笔记第30天)

發布時間:2025/3/20 数据库 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 相同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天)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。