MySQL - Unknown table in MULTI DELETE

在存儲過程中,調用:

delete a from db1.tb1 a, db2.tb2 b where a.col1 = b.col1 and a.col2 = b.col2;

出現題目中的錯誤,原因如下:

在mysql中多表聯合刪除時,表別名只能在sql中表關聯部分聲明。我們應該避免不是表關聯部分聲明別名,因爲這產生歧義的sql,從而產生不是期望的結果,例如在錯誤的表中刪除行,舉個例子來說:

DELETE t1 AS a2 FROM t1 AS a1 INNER JOIN t2 AS a2;

對於多個表的刪除,表的列表中提到的表別名的引用,使用默認數據庫,除非已經明確地指定了一個數據庫。例如,如果默認數據庫是db1,下面的語句將不會工作,因爲不確定的別名a2被認爲已經有了db1:

DELETE a1, a2 FROM db1.t1 AS a1 INNER JOIN db2.t2 AS a2
WHERE a1.id=a2.id;

除了默認數據庫外,爲了正確地匹配表的別名,我們必須明確地指定正確的數據庫的名字,

DELETE a1, db2.a2 FROM db1.t1 AS a1 INNER JOIN db2.t2 AS a2
WHERE a1.id=a2.id;

根據上述理論,我的sql應該這樣寫:

delete db1.a from db1.tb1 a, db2.tb2 b where a.col1 = b.col1 and a.col2 = b.col2;

還有需要注意的是:

1、如果你爲一個表聲明瞭別名,當你指向這個表的時候,就必須使用這個別名,例如:

-- 正確的寫法:
DELETE t1 FROM test AS t1, test2 WHERE ...

-- 錯誤的寫法:
DELETE test FROM test AS t1, test2 WHERE ...

2、在多個表聯合刪除時,不能使用order by或limit,而單個表的刪除時就沒有這個限制。

3、當前我們還不能在刪除表的時候,在子查詢中select from相同的表。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章