程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> 更多數據庫知識 >> 數據庫Sql語句中You cant specify target table錯誤解決方法

數據庫Sql語句中You cant specify target table錯誤解決方法

編輯:更多數據庫知識

數據庫Sql語句中You can't specify target table錯誤解決方法

mysql的INSERT 和 UPDATE中如果使用子查詢, 並且子查詢的表和要操作的表同名

類似如下這一句SQL代碼

update topics set status=1 where id in (select MAX(id) from topics where status=0 group by forum_id); 

執行過程中就會報錯 SQL代碼錯誤碼: 1093  You can't specify target table 'topics' for update in FROM clause

查詢了一下相關資料,發現應該是排他鎖造成的下面是關於SQL操作中鎖的相關介紹:

INSERT、UPDATE 或 DELETE過程中應用排它鎖SELECT過程中應用共享鎖共享鎖又稱讀鎖,若事務T對數據對象A加上S鎖,則事務T可以讀A但不能修改A,其他事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。

這保證了其他事務可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改。
排它鎖又稱寫鎖。若事務T對數據對象A加上X鎖,事務T可以讀A也可以修改A,其他事務不能再對A加任何鎖,直到T釋放A上的鎖。這保證了其他事務在T釋放A上的鎖之前不能再讀取和修改A。

1.共享鎖只用於表級,排它鎖用於行級。

2.加了共享鎖的對象,可以繼續加共享鎖,不能再加排它鎖。加了排它鎖後,不能再加任何鎖。

這句sql的正確寫法如下

update topics set status=1 where id in (select MAX(id) from topics  tmp  where status=0 group by forum_id);

只需要在子查詢中 給 `tableA` 另取一個別名即可解決. *
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved