第二章 SQL命令參考-UPDATE
Updates rowsof a table.
概要
UPDATE [ONLY] table [[AS] alias]
SET {column = {expression | DEFAULT} |
(column [,...]) = ({expression | DEFAULT} [,...])}[,...]
[FROM fromlist]
[WHERE condition | WHERE CURRENT OF cursor name ]
描述
UPDATE更改滿足條件的所有行中指定列的值。 SET子句中只需要提及需要修改的列; 未明確修改的列保留以前的值。
預設情況下,UPDATE將更新指定表及其所有子表中的行。 如果您只希望更新提到的特定表格,則必須使用ONLY子句。
有兩種方法可以使用資料庫中其他表中包含的資訊修改表:使用子選擇或在FROM子句中指定其他表。 哪種技術更合適取決於具體情況。
如果指定了WHERE CURRENTOF子句,則更新的行是最近從指定遊標中獲取的行。
您必須在表上具有UPDATE特權才能將其更新,並將SELECT特權授予在表示式或條件中讀取其值的任何表。
.
parameter
ONLY
如果指定,則只更新來自命名錶的行。未指定時,還會處理從命名錶繼承的任何表。
table
現有表的名稱(可以是模式修飾的)。
alias
目標表的替代名稱。提供別名時,會完全隱藏表的實際名稱。例如,給定UPDATE foo ASf,UPDATE語句的其餘部分必須將此表引用為f not foo。
column
表格中列的名稱。如果需要,可以使用子欄位名稱或陣列下標來限定列名稱。不要在目標列的規範中包含表名。
expression
要分配給列的表示式。表示式可以使用表中這個和其他列的舊值。
DEFAULT
將列設定為其預設值(如果沒有指定特定的預設表示式,則該列將為NULL)。
fromlist
表表達式的列表,允許來自其他表的列出現在WHERE條件和更新表示式中。這與在SELECT語句的FROM子句中可以指定的表的列表類似。請注意,目標表不得出現在fromlist中,除非您打算進行自聯接(在這種情況下,它必須在fromlist中出現一個別名)。
condition
一個返回boolean型別值的表示式。只有該表示式返回true的行才會被更新。
cursor_name
在WHERE CURRENTOF條件中使用的遊標的名稱。要更新的行是最近從游標中獲取的行。遊標必須是UPDATE命令目標表上的簡單(非連線,非聚合)查詢。有關建立遊標的更多資訊,請參閱DECLARE。
WHERE CURRENTOF不能與布林條件一起指定。
output_expression
在更新每行之後,由UPDATE命令計算並返回的表示式。該表示式可以使用FROM中列出的表或列的任何列名。
output_name
用於返回列的名稱。
SET不允許在表格的Greenplum分配鍵列上使用。
當存在FROM子句時,本質上發生的事情是目標表被連線到從列表中提到的表,連線的每個輸出行表示目標表的更新操作。當使用FROM時,應確保連線為每個要修改的行生成至多一個輸出行。換句話說,一個目標行不應該連線到另外一個表中的多行。如果是這樣,那麼只有其中一個連線行將被用來更新目標行,但哪一個將被使用是不容易預測的。
由於這種不確定性,僅在子選擇內引用其他表是比較安全的,雖然通常難以閱讀,並且比使用聯接更慢。
不支援直接在分割槽表的特定分割槽(子表)上執行UPDATE和DELETE命令。相反,這些命令必須在根分割槽表(即使用CREATETABLE命令建立的表)上執行。
示例
Change the word Drama to Dramatic inthe column kind of the table films:
UPDATEfilms SET kind = 'Dramatic' WHERE kind = 'Drama';
Adjusttemperature entries and reset precipitation to its default value in one row ofthe table weather:
UPDATEweather SET temp_lo = temp_lo+1, temp_hi = temp_lo+15, prcp = DEFAULT
WHEREcity = 'San Francisco' AND date = '2006-07-03';
Use thealternative column-list syntax to do the same update:
UPDATEweather SET (temp_lo, temp_hi, prcp) = (temp_lo+1,
temp_lo+15,DEFAULT)
WHEREcity = 'San Francisco' AND date = '2006-07-03';
Increment thesales count of the salesperson who manages the account for Acme Corporation,using the
FROMclause syntax (assuming both tables being joined are distributed in GreenplumDatabase on the id
column):
UPDATEemployees SET sales_count = sales_count + 1 FROM
accounts
WHEREaccounts.name = 'Acme Corporation'
ANDemployees.id = accounts.id;
Perform the sameoperation, using a sub-select in the WHEREclause:
UPDATEemployees SET sales_count = sales_count + 1 WHERE id =
(SELECTid FROM accounts WHERE name = 'Acme Corporation');
Attempt to inserta new stock item along with the quantity of stock. If the item already exists,instead
update the stockcount of the existing item. To do this without failing the entire transaction,use savepoints.
BEGIN;
--other operations
SAVEPOINTsp1;
INSERTINTO wines VALUES('Chateau Lafite 2003', '24');
--Assume the above fails because of a unique key violation,
-- sonow we issue these commands:
ROLLBACKTO sp1;
UPDATEwines SET stock = stock + 24 WHERE winename = 'Chateau
Lafite2003';
--continue with other operations, and eventually
COMMIT;
相容性
該命令符合SQL標準,但FROM子句是Greenplum資料庫擴充套件。
根據標準,列列表語法應允許從單個行值表示式(例如子選擇)分配列的列表:
UPDATE accounts SET(contact_last_name, contact_first_name)=
(SELECT last_name, first_name FROMsalesmen WHERE salesmen.id = accounts.sales_id);
This is not currently implemented —the source must be a list of independent expressions.
其他一些資料庫系統提供了一個FROM選項,目標表應該在FROM中再次列出。 這不是Greenplum資料庫如何解釋FROM。 移植使用此副檔名的應用程式時要小心。
相關參考