普通的單表更新或刪除sql你們確定倒背如流,但你有用過連表更新或刪除的sql嗎, 這個在表間關聯來作更新和刪除操做很是有用. 本文分表介紹瞭如何用update ,delete作聯表操做的方法, php程序員站 先看mysql update對於聯表更新的說明php
-------------------------- mysql
--------------------------程序員
您也能夠執行包括多個表的UPDATE操做。table_references子句列出了在聯合中包含的表。該語法在13.2.7.1節,「JOIN語法」中進行了說明。如下是一個例子:sql
UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;
以上的例子顯示出了使用逗號操做符的內部聯合,可是multiple-table UPDATE語句可使用在SELECT語句中容許的任何類型的聯合,好比LEFT JOIN。數據庫
註釋:您不能把ORDER BY或LIMIT與multiple-table UPDATE同時使用。oracle
在一個被更改的multiple-table UPDATE中,有些列被引用。您只須要這些列的UPDATE權限。有些列被讀取了,可是沒被修改。您只須要這些列的SELECT權限。優化
若是您使用的multiple-table UPDATE語句中包含帶有外鍵限制的InnoDB表,則MySQL優化符處理表的順序可能與上下層級關係的順序不一樣。在此狀況下,語句無效並被 回滾。同時,更新一個單一表,而且依靠ON UPDATE功能。該功能由InnoDB提供,用於對其它表進行相應的修改。請參見15.2.6.4節,「FOREIGN KEY約束」。spa
目前,您不能在一個子查詢中更新一個表,同時從同一個表中選擇。server
---------------------------------------blog
舉例說明:好比我如今有個主文章表,和一個文章附表,主文章表裏存放一些文章的title,category分類,添加時間,和更新時間之類的基本信息,附文章表裏放文章的內容.
我如今要更新主,附表裏id爲1的文章內容,我能夠執行如下sql:
update a left join b on a.id=b.a_id set a.title='aaaaa',b.body='bbbb' where a.id=1www~phperz~com
再看delete的聯表刪除 www~phperz~com
mysql手冊中的描述
您能夠在一個DELETE語句中指定多個表,根據多個表中的特定條件,從一個表或多個表中刪除行。不過,您不能在一個多表DELETE語句中使用ORDER BY或LIMIT。
table_references部分列出了包含在聯合中的表。此語法在13.2.7.1節,「JOIN語法」中進行了說明。 www~phperz~com
對於第一個語法,只刪除列於FROM子句以前的表中的對應的行。對於第二個語法,只刪除列於FROM子句之中(在USING子句以前)的表中的對應的行。做用是,您能夠同時刪除許多個表中的行,並使用其它的表進行搜索:
DELETE t1, t2 FROM t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;
或:
DELETE FROM t1, t2 USING t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;
當搜索待刪除的行時,這些語句使用全部三個表,可是隻從表t1和表t2中刪除對應的行。
以上例子顯示了使用逗號操做符的內部聯合,可是多表DELETE語句可使用SELECT語句中容許的全部類型的聯合,好比LEFT JOIN。
本語法容許在名稱後面加.*,以便與Access相容。
若是您使用的多表DELETE語句包括InnoDB表,而且這些表受外鍵的限制,則MySQL優化程序會對錶進行處理,改變原來的從屬關係。在這種狀況下,該語句出現錯誤並返回到前面的步驟。要避免此錯誤,您應該從單一表中刪除,並依靠InnoDB提供的ON DELETE功能,對其它表進行相應的修改。
註釋:當引用表名稱時,您必須使用別名(若是已給定): php程序員站
DELETE t1 FROM test AS t1, test2 WHERE ...
進行多表刪除時支持跨數據庫刪除,可是在此狀況下,您在引用表時不能使用別名。舉例說明:phperz~com
DELETE test1.tmp1, test2.tmp2 FROM test1.tmp1, test2.tmp2 WHERE ...
目前,您不能從一個表中刪除,同時又在子查詢中從同一個表中選擇。
------------------------------------
如今咱們還對剛纔那二個表舉例,刪除主,附表裏id爲1的文章內容,我能夠執行如下sql:
delete a,b from a left join b on a.id=b.a_id where a.id=1
注意我給加紅的地方,若是你只刪除多個表中的某個表裏的數據,則在delete後面只跟那個表的名子,我舉的例子是同時刪除a和b中aid=1的數據,也就是同時刪二個表的數據. php程序員站
如圖:
注:本文以是mysql來說解的,其餘的好比sql server ,access,oracle等也有他們各自不一樣的語法,用時請各位根據手冊上的語法自本身摸索. ph