MySQL聯合多表更新和刪除,mysql聯合更新
多表更新
在 MySQL 3.23 中,你可以使用 LIMIT # 來確保只有給定的記錄行數目被更改。
如果一個 ORDER BY 子句被使用(從 MySQL 4.0.0 開始支援),記錄行將以指定的次序被更新。這實際上只有連同 LIMIT 一起才有用。
從 MySQL 4.0.4 開始,你也可以執行一個包含多個表的 UPDATE 的操作:
UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;
注意:多表 UPDATE 不可以使用 ORDER BY 或 LIMIT。
多表刪除
第一個多表刪除格式從 MySQL 4.0.0 開始被支援。第二個多表刪除格式從 MySQL 4.0.2 開始被支援。
僅僅在 FROM 或 USING 子句 之前 列出的表中的匹配記錄行被刪除。效果就是,你要以從多個表中同時刪除記錄行,並且同樣可以有其它的表用於檢索。
在表名後的 .* 僅僅是為了相容 Access:
DELETE t1,t2 FROM t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id
or
DELETE FROM t1,t2 USING t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id
在上面的情況下,我們僅僅從 t1 和 t2 表中刪除匹配的記錄行。
如果一個 ORDER BY 子句被使用(從 MySQL 4.0.0 開始支援), 記錄行將以指定的次序刪除。這實際上只有連同 LIMIT 一起才有用。樣本如下:
DELETE FROM somelog
WHERE user = 'jcole'
ORDER BY timestamp
LIMIT 1
這將刪除匹配 WHERE 子句的,並且最早被插入(通過 timestamp 來確定)的記錄行。
DELETE 語句的LIMIT rows 選項是 MySQL 特有的,它告訴伺服器在控制權被返回到用戶端之前可被刪除的最大記錄行數目。這可以用來確保一個特定的 DELETE 命令不會佔用太長的時間。你可以簡單地重複使用 DELETE 命令,直到被影響的記錄行數目小於 LIMIT 值。
從 MySQL 4.0 開始,在 DELETE 語句中可以指定多個表,用以從一個表中刪除依賴於多表中的特殊情況的記錄行。然而,在一個多表刪除中,不能使用 ORDER BY 或 LIMIT。假設有兩個表,tab1,tab2,分別有產品名稱和產品價格,現在我想用tab2的價格替換tab1的價格,我寫的語句是Update tab1 set tab1.產品價格=tab2.產品價格 where tab1.產品名稱=tab2.產品名稱
結果出現錯誤,提示為:列首碼 'tab2' 與查詢中所用的表名或別名不匹配。請問應該怎樣寫,
SQL語句是不支援多表同時更新的。
應該這樣寫
update tab1 set tab1.產品價格 = (select tab2.產品價格 from tab2 where tab2.產品名稱 = tab1.產品名稱) where tabl1.產品名稱 in (select tab2.產品名稱 from tab2)
後面的where tab1.產品名稱 in (select tab2.產品名稱 from tab2) 這句保證了如果tab1的產品在tab2沒有記錄時不會出錯。
在 開發中,資料庫來回換,而有些關鍵性的文法又各不相同,這是一件讓開發人員很頭痛的事情.本文總結了Update語句更新多表時在SQL Server,Oracle,MySQL三種資料庫中的用法.我也試了SQLite資料庫,都沒成功,不知是不支援多表更新還是咋的.
在本例中:
我們要用表gdqlpj中的gqdltks,bztks欄位資料去更新landleveldata中的同欄位名的資料,條件是當landleveldata 中的GEO_Code欄位值與gdqlpj中的lxqdm欄位值相等時進行更新.
SQL Server文法:
UPDATE
{
table_name WITH ( < table_hint_limited > [ ...n ] )
| view_name
| rowset_function_limited
}
SET
{ column_name = { expression | DEFAULT | NULL }
| @variable = expression
| @variable = column = expression } [ ,...n ]
{ { [ FROM { < table_source > } [ ,...n ] ]
[ WHERE
< search_condition > ] }
|
[ WHERE CURRENT OF
{ { [ GLOBAL ] cursor_name } | cursor_variable_name }
] }
[ OPTION ( < query_hint > [ ,...n ] ) ]
SQL Server樣本:
update a
set a.gqdltks=b.gqdltks,a.bztks=b.bztks
from landleveldata a,gdqlpj b
where a.GEO_Code=b.lxqdm
Oracle文法:
UPDATE updatedtable
SET (col_name1[,col_name2...])=
(SELECT col_name1,[,col_name2...]
FROM srctable [WHERE where_definition])
Oracel 樣本:
update landleveldata a
set (a.gqdltks, a.bztks)=
(select b.gqdltks, b.bztks from gdqlpj b
where a.GEO_Code=b.lxqdm)
MySQL文法:
UPDATE table_references
SET col_name1=expr1 [, col_name2=expr2 ...]
[WHERE where_definition]
MySQL 樣本:
update landleveldata a, gdqlpj b
set a.gqdltks= b.gqdltks,
a.bztks= b.bztks
where a.GEO_Code=b.lxqdm
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。