數據庫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);