在存儲過程中,調用:
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相同的表。