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)
新架构 FAQ
集群部署 FAQ
SQL 查询 FAQ
MatrixGate FAQ
运维 FAQ
监控告警 FAQ
PXF FAQ
PLPython FAQ
性能 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的方式。 移植使用此扩展名的应用程序时请小心。