?
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
UPDATE [ ONLY ] table [ [ AS ] alias ] SET { column = { expression | DEFAULT } | ( column [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...] [ FROM from_list ] [ WHERE condition | WHERE CURRENT OF cursor_name ] [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
UPDATE改變滿足條件的所有行中指定的字段值。只在SET子句 中出現(xiàn)需要修改的行,沒有出現(xiàn)的其他字段保持它們原來的數(shù)值。
缺省時,UPDATE將更新所聲明的表和所有子表的記錄。如果你希望只更新所聲明的表, 應(yīng)該使用ONLY子句。
使用同一數(shù)據(jù)庫里其它表的信息來更新一個表有兩種方法:使用子查詢,或者在FROM子句 里聲明另外一個表。哪個方法更好取決于具體的環(huán)境。
可選的RETURNING子句將導(dǎo)致UPDATE基于每個被更新的行計(jì)算返回值。任何 FROM中使用的字段都可以用于計(jì)算。計(jì)算的時候使用剛剛被更新過的字段新值。 RETURNING列表的語法與SELECT的輸出列表相同。
您必須對表有UPDATE權(quán)限,或者至少在更新的列上。您必須也在 任何列上都有權(quán)限,這些列的值會在expressions或者 condition中讀取。
現(xiàn)存表的名稱(可以有模式修飾)
目標(biāo)表的別名。如果指定了別名,那么它將完全遮蓋表的本名。例如,給定UPDATE foo AS f之后, 剩余的UPDATE語句必須用f而不是foo引用這個表。
表table中的字段名。必要時,字段名可以用子域名或者數(shù) 組下標(biāo)修飾。不要在指定字段名的時候加上表名字。比如UPDATE tab SET tab.col = 1就是錯誤的。
分配給列的表達(dá)式。表達(dá)式可以使用這個或其它字段更新前的舊值。
把字段設(shè)置為它的缺省值,如果沒有缺省表達(dá)式,那么就是 NULL。
一個表表達(dá)式的列表,允許來自其它表中的字段出現(xiàn)在WHERE條件里。 這個類似于可以在一個SELECT語句的 FROM子句子句里聲明表列表。請注意 目標(biāo)表絕對不能出現(xiàn)在from_list里,除非你是在使用一個自連接 (此時它必須以from_list的別名出現(xiàn))。
一個返回boolean結(jié)果的表達(dá)式。只有這個表達(dá)式返回true的行才會被更新。
在WHERE CURRENT OF條件下使用的游標(biāo)的名稱。要更新的行是一個最近從該游標(biāo) 中抓去的。該游標(biāo)必須是一個UPDATE目標(biāo)表中的非分組查詢。請注意 WHERE CURRENT OF不能用布爾條件聲明。參閱DECLARE 獲取更多關(guān)于通過WHERE CURRENT OF使用游標(biāo)的信息。
在所有需要更新的行都被更新之后,UPDATE命令用于計(jì)算返回值的表達(dá)式。 這個表達(dá)式可以使用任何table以及FROM 中列出的表的字段。寫上*表示返回所有字段。
字段的返回名稱
成功完成后,UPDATE返回形如
UPDATE count
的命令標(biāo)簽。count是更新的行數(shù)。如果為 0 則表示沒有符合condition的行(這個不認(rèn)為是錯誤)。
如果UPDATE包含RETURNING子句,那么返回的結(jié)果將類似于包含 RETURNING字段和表達(dá)式列表的SELECT語句,只不過返回結(jié)果是基于被更新的行而已。
在出現(xiàn)FROM子句的時候,實(shí)際上發(fā)生的事情是目標(biāo)表和from_list 里提到的表連接在一起,并且每個連接輸出行都代表一個目標(biāo)表的更新操作。在使用FROM的時候, 你應(yīng)該保證連接為每個需要修改的行最多生成一個輸出行。換句話說,一個目標(biāo)行不應(yīng)該和超過一行來自其它 表的數(shù)據(jù)行連接。如果它連接了多于一個行,那么連接行里面將會只有一行用于更新目標(biāo)行,但是究竟使用哪 行是很難預(yù)期的事情。
因?yàn)檫@個不確定性,只再子查詢里面引用其它表是安全的,盡管通常更難讀并且比使用連接也更慢些。
把表films里的字段kind里的詞Drama用 Dramatic代替:
UPDATE films SET kind = 'Dramatic' WHERE kind = 'Drama';
調(diào)整表weather中的某行的溫度并把該行的降水量設(shè)置為缺省值:
UPDATE weather SET temp_lo = temp_lo+1, temp_hi = temp_lo+15, prcp = DEFAULT WHERE city = 'San Francisco' AND date = '2003-07-03';
做同樣的事情并返回更新后的條目:
UPDATE weather SET temp_lo = temp_lo+1, temp_hi = temp_lo+15, prcp = DEFAULT WHERE city = 'San Francisco' AND date = '2003-07-03' RETURNING temp_lo, temp_hi, prcp;
使用另一種字段列表語法來做同樣的事情:
UPDATE weather SET (temp_lo, temp_hi, prcp) = (temp_lo+1, temp_lo+15, DEFAULT) WHERE city = 'San Francisco' AND date = '2003-07-03';
增加負(fù)責(zé) Acme 公司客戶的銷售員的銷售計(jì)數(shù),使用FROM子句語法:
UPDATE employees SET sales_count = sales_count + 1 FROM accounts WHERE accounts.name = 'Acme Corporation' AND employees.id = accounts.sales_person;
使用WHERE子句里的子查詢執(zhí)行同樣的操作:
UPDATE employees SET sales_count = sales_count + 1 WHERE id = (SELECT sales_person FROM accounts WHERE name = 'Acme Corporation');
試圖帶著庫存量插入一個新的庫存項(xiàng)。如果該項(xiàng)存在,則更新現(xiàn)有項(xiàng)的庫存數(shù)。 要做這件事情而又不使整個事務(wù)失效,使用保留點(diǎn)。
BEGIN; -- other operations SAVEPOINT sp1; INSERT INTO wines VALUES('Chateau Lafite 2003', '24'); -- Assume the above fails because of a unique key violation, -- so now we issue these commands: ROLLBACK TO sp1; UPDATE wines SET stock = stock + 24 WHERE winename = 'Chateau Lafite 2003'; -- continue with other operations, and eventually COMMIT;
更改表films的kind列,在游標(biāo)c_films 目前定位的行上:
UPDATE films SET kind = 'Dramatic' WHERE CURRENT OF c_films;
這條命令遵循SQL標(biāo)準(zhǔn)。只是FROM和RETURNING 子句是PostgreSQL擴(kuò)展。
標(biāo)準(zhǔn)的字段列表語法允許從行值表達(dá)式指定字段列表,比如一個子查詢:
UPDATE accounts SET (contact_last_name, contact_first_name) = (SELECT last_name, first_name FROM salesmen WHERE salesmen.id = accounts.sales_id);
這個功能目前尚未實(shí)現(xiàn):源必須是一個獨(dú)立的表達(dá)式。
有些其它數(shù)據(jù)庫系統(tǒng)提供一個FROM選項(xiàng),在這個選項(xiàng)下,認(rèn)為目標(biāo)表 會再次在FROM里列出。這不是PostgreSQL 解析FROM的方式。移植使用這類擴(kuò)展的應(yīng)用時要注意。