400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
YMatrix 文档
关于 YMatrix
标准集群部署
数据写入
数据迁移
数据查询
运维监控
参考指南
工具指南
数据类型
存储引擎
执行引擎
流计算引擎
灾难恢复
系统配置参数
索引
扩展
SQL 参考
常见问题(FAQ)
更新表的行。
[ WITH [ RECURSIVE ] with_query [, ...] ]
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 CURRENT OF子句,则更新的行是从指定游标中最新获取的行。
复制表不支持WHERE CURRENT OF子句。
您必须在表上或至少在要更新的列上具有UPDATE特权。 您还必须拥有读取expression或condition中的任何列的SELECT特权。
注意:默认情况下,YMatrix 数据库为堆表的UPDATE操作获取表的EXCLUSIVE锁。 启用全局死锁检测器后,堆表上UPDATE操作的锁定模式为ROW EXCLUSIVE。
成功完成后,UPDATE命令将返回以下格式的命令标记:
UPDATE count
其中count是更新的行数。 如果count为0,则没有符合条件的行(这不视为错误)。
with_query
ONLY
table
alias
column
expression
DEFAULT
fromlist
condition
cursor_name
output_expression
output_name
在表的 YMatrix 分布键列上不允许使用SET。
当存在FROM子句时,本质上是将目标表连接到from列表中提到的表, 并且连接的每个输出行都代表目标表的更新操作。 使用FROM时,应确保该连接为要修改的每一行最多产生一个输出行。 换句话说,目标行不应与其他表中的一行连接。 如果是这样,那么将仅使用连接行之一来更新目标行,但是将很难预测将使用哪一行。
由于存在这种不确定性,因此仅在子选择内引用其他表会更安全,尽管与使用连接相比,通常更难阅读,也更慢。
不支持在分区表的特定分区(子表)上直接执行UPDATE和DELETE命令。 而是在根分区表(使用CREATE TABLE命令创建的表)上执行这些命令。
将表films中的kind列,从Drama改为Dramatic:
UPDATE films SET kind = 'Dramatic' WHERE kind = 'Drama';
调整温度条目并将表weather的一行中的降水重置为默认值:
UPDATE weather SET temp_lo = temp_lo+1, temp_hi =
temp_lo+15, prcp = DEFAULT
WHERE city = 'San Francisco' AND date = '2016-07-03';
使用替代的列列表语法进行相同的更新:
UPDATE weather SET (temp_lo, temp_hi, prcp) = (temp_lo+1,
temp_lo+15, DEFAULT)
WHERE city = 'San Francisco' AND date = '2016-07-03';
使用FROM子句语法增加管理Acme Corporation帐户的销售人员的销售数量(假设两个被连接的表在 YMatrix 数据库中都基于id列分布):
UPDATE employees SET sales_count = sales_count + 1 FROM
accounts
WHERE accounts.name = 'Acme Corporation'
AND employees.id = accounts.id;
使用WHERE子句中的子选择来执行相同的操作:
UPDATE employees SET sales_count = sales_count + 1 WHERE id =
(SELECT id FROM accounts WHERE name = 'Acme Corporation');
尝试插入新的库存商品以及库存数量。 如果物料已经存在,请更新现有物料的库存数量。 要在不使整个事务失败的情况下执行此操作,请使用保存点。
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;
该命令符合SQL标准,但FROM子句是 YMatrix 数据库扩展。
根据标准,列列表语法应允许从单个行值表达式(例如子选择)分配列列表:
UPDATE accounts SET (contact_last_name, contact_first_name) =
(SELECT last_name, first_name FROM salesmen
WHERE salesmen.id = accounts.sales_id);
当前尚未实现-源必须是独立表达式的列表。
其他一些数据库系统提供FROM选项,该目标表应该在FROM中再次列出。 那不是 YMatrix 数据库解释FROM的方式。 移植使用此扩展名的应用程序时请小心。