MySQL多表關聯數據同時刪除sql語句


DELETE刪除多表數據,怎樣才能同時刪除多個關聯表的數據呢?這里做了深入的解釋:

 代碼如下 復制代碼
1    delete from t1 where 條件
2    delete t1 from t1 where 條件
3    delete t1 from t1,t2 where 條件
4    delete t1,t2 from t1,t2 where 條件

category(欄目信息表)和news(新聞數據表)。

category中的id(欄目編號)字段作為該表的主鍵(primary key).唯一標識了一個欄目的信息。 
news 中的id字段作為該表的主鍵(primary key).唯一標識了一個欄目的信息。

category_id(欄目編號)字段與category表的id字段相關聯。

1.SQL刪除語句

 代碼如下 復制代碼


delete category,news from category left join news on category.id = news.category_id


1、從數據表t1中把那些id值在數據表t2里有匹配的記錄全刪除掉1  

 代碼如下 復制代碼

 DELETE t1 FROM t1,t2 WHERE t1.id=t2.id 或 DELETE FROM t1 USING t1,t2 WHERE t1.id=t2.id


2、從數據表t1里在數據表t2里沒有匹配的記錄查找出來並刪除掉1  

 代碼如下 復制代碼

 DELETE t1 FROM t1 LEFT JOIN T2 ON t1.id=t2.id WHERE t2.id IS NULL 或 DELETE FROM t1,USING t1 LEFT JOIN T2 ON t1.id=t2.id WHERE t2.id IS NULL


3、 從兩個表中找出相同記錄的數據並把兩個表中的數據都刪除掉1  
 

 代碼如下 復制代碼
DELETE t1,t2 from t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t1.id=25


注意此處的delete t1,t2 from 中的t1,t2不能是別名

如:1  

 代碼如下 復制代碼

delete t1,t2 from table_name as t1 left join table2_name as t2 on t1.id=t2.id where table_name.id=25

在數據里面執行是錯誤的(MYSQL 版本不小於5.0在5.0中是可以的)

上述語句改 寫成1  
 

 

 代碼如下 復制代碼
 delete table_name,table2_name from table_name as t1 left join table2_name as t2 on t1.id=t2.id where table_name.id=25

 

 

Unknown table 'a' 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相同的表。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM