您的位置:首页 > 数据库

第二章 SQL命令参考-UPDATE

2017-11-19 18:58 330 查看
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

用于返回列的名称。
Notes
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。 移植使用此扩展名的应用程序时要小心。
相关参考
DECLARE, DELETE, SELECT,
INSERT
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: