一 、概述 更新stmt: 隐藏 
 
 
WITH 
RECURSIVE 
common-table-expression 
, 
UPDATE 
OR 
ROLLBACK 
qualified-table-name 
OR 
REPLACE 
OR 
IGNORE 
OR 
FAIL 
OR 
ABORT 
SET 
column-name-list 
= 
expr 
column-name 
, 
FROM 
table-or-subquery 
, 
join-clause 
WHERE 
expr 
returning-clause 
 
列名列表: 节目 
 
公用表表达式: 节目 
 
 
table-name 
( 
column-name 
) 
AS 
NOT 
MATERIALIZED 
( 
select-stmt 
) 
, 
 
选择stmt: 节目 
 
 
WITH 
RECURSIVE 
common-table-expression 
, 
SELECT 
DISTINCT 
result-column 
, 
ALL 
FROM 
table-or-subquery 
join-clause 
, 
WHERE 
expr 
GROUP 
BY 
expr 
HAVING 
expr 
, 
WINDOW 
window-name 
AS 
window-defn 
, 
VALUES 
( 
expr 
) 
, 
, 
compound-operator 
select-core 
ORDER 
BY 
LIMIT 
expr 
ordering-term 
, 
OFFSET 
expr 
, 
expr 
 
复合运算符: 节目 
 
 
UNION 
UNION 
INTERSECT 
EXCEPT 
ALL 
 
 
订购条款: 节目 
 
 
expr 
COLLATE 
collation-name 
DESC 
ASC 
NULLS 
FIRST 
NULLS 
LAST 
 
 
结果列: 节目 
 
 
expr 
AS 
column-alias 
* 
table-name 
. 
* 
 
 
窗口定义: 节目 
 
 
( 
base-window-name 
PARTITION 
BY 
expr 
, 
ORDER 
BY 
ordering-term 
, 
frame-spec 
) 
 
框架规格: 节目 
 
 
GROUPS 
BETWEEN 
UNBOUNDED 
PRECEDING 
AND 
UNBOUNDED 
FOLLOWING 
RANGE 
ROWS 
UNBOUNDED 
PRECEDING 
expr 
PRECEDING 
CURRENT 
ROW 
expr 
PRECEDING 
CURRENT 
ROW 
expr 
FOLLOWING 
expr 
PRECEDING 
CURRENT 
ROW 
expr 
FOLLOWING 
EXCLUDE 
CURRENT 
ROW 
EXCLUDE 
GROUP 
EXCLUDE 
TIES 
EXCLUDE 
NO 
OTHERS 
 
 
 
 
 
表达式: 节目 
 
 
literal-value 
bind-parameter 
schema-name 
. 
table-name 
. 
column-name 
unary-operator 
expr 
expr 
binary-operator 
expr 
function-name 
( 
DISTINCT 
expr 
) 
filter-clause 
over-clause 
, 
* 
( 
expr 
) 
, 
CAST 
( 
expr 
AS 
type-name 
) 
expr 
COLLATE 
collation-name 
expr 
NOT 
LIKE 
GLOB 
REGEXP 
MATCH 
expr 
expr 
ESCAPE 
expr 
expr 
ISNULL 
NOTNULL 
NOT 
NULL 
expr 
IS 
NOT 
DISTINCT 
FROM 
expr 
expr 
NOT 
BETWEEN 
expr 
AND 
expr 
expr 
NOT 
IN 
( 
select-stmt 
) 
expr 
, 
schema-name 
. 
table-function 
( 
expr 
) 
table-name 
, 
NOT 
EXISTS 
( 
select-stmt 
) 
CASE 
expr 
WHEN 
expr 
THEN 
expr 
ELSE 
expr 
END 
raise-function 
 
过滤器子句: 节目 
 
字面值: 节目 
 
 
CURRENT_TIMESTAMP 
numeric-literal 
string-literal 
blob-literal 
NULL 
TRUE 
FALSE 
CURRENT_TIME 
CURRENT_DATE 
 
 
过度条款: 节目 
 
 
OVER 
window-name 
( 
base-window-name 
PARTITION 
BY 
expr 
, 
ORDER 
BY 
ordering-term 
, 
frame-spec 
) 
 
框架规格: 节目 
 
 
GROUPS 
BETWEEN 
UNBOUNDED 
PRECEDING 
AND 
UNBOUNDED 
FOLLOWING 
RANGE 
ROWS 
UNBOUNDED 
PRECEDING 
expr 
PRECEDING 
CURRENT 
ROW 
expr 
PRECEDING 
CURRENT 
ROW 
expr 
FOLLOWING 
expr 
PRECEDING 
CURRENT 
ROW 
expr 
FOLLOWING 
EXCLUDE 
CURRENT 
ROW 
EXCLUDE 
GROUP 
EXCLUDE 
TIES 
EXCLUDE 
NO 
OTHERS 
 
 
订购条款: 节目 
 
 
expr 
COLLATE 
collation-name 
DESC 
ASC 
NULLS 
FIRST 
NULLS 
LAST 
 
 
 
提升功能: 节目 
 
 
RAISE 
( 
ROLLBACK 
, 
error-message 
) 
IGNORE 
ABORT 
FAIL 
 
 
选择stmt: 节目 
 
 
WITH 
RECURSIVE 
common-table-expression 
, 
SELECT 
DISTINCT 
result-column 
, 
ALL 
FROM 
table-or-subquery 
join-clause 
, 
WHERE 
expr 
GROUP 
BY 
expr 
HAVING 
expr 
, 
WINDOW 
window-name 
AS 
window-defn 
, 
VALUES 
( 
expr 
) 
, 
, 
compound-operator 
select-core 
ORDER 
BY 
LIMIT 
expr 
ordering-term 
, 
OFFSET 
expr 
, 
expr 
 
复合运算符: 节目 
 
 
UNION 
UNION 
INTERSECT 
EXCEPT 
ALL 
 
 
订购条款: 节目 
 
 
expr 
COLLATE 
collation-name 
DESC 
ASC 
NULLS 
FIRST 
NULLS 
LAST 
 
 
结果列: 节目 
 
 
expr 
AS 
column-alias 
* 
table-name 
. 
* 
 
 
窗口定义: 节目 
 
 
( 
base-window-name 
PARTITION 
BY 
expr 
, 
ORDER 
BY 
ordering-term 
, 
frame-spec 
) 
 
框架规格: 节目 
 
 
GROUPS 
BETWEEN 
UNBOUNDED 
PRECEDING 
AND 
UNBOUNDED 
FOLLOWING 
RANGE 
ROWS 
UNBOUNDED 
PRECEDING 
expr 
PRECEDING 
CURRENT 
ROW 
expr 
PRECEDING 
CURRENT 
ROW 
expr 
FOLLOWING 
expr 
PRECEDING 
CURRENT 
ROW 
expr 
FOLLOWING 
EXCLUDE 
CURRENT 
ROW 
EXCLUDE 
GROUP 
EXCLUDE 
TIES 
EXCLUDE 
NO 
OTHERS 
 
 
 
 
类型名称: 节目 
 
 
name 
( 
signed-number 
, 
signed-number 
) 
( 
signed-number 
) 
 
签名号码: 节目 
 
 
 
加入子句: 节目 
 
 
table-or-subquery 
join-operator 
table-or-subquery 
join-constraint 
 
加入约束: 节目 
 
 
USING 
( 
column-name 
) 
, 
ON 
expr 
 
 
联合运营商: 节目 
 
 
NATURAL 
LEFT 
OUTER 
JOIN 
, 
RIGHT 
FULL 
INNER 
CROSS 
 
 
 
限定表名: 节目 
 
 
schema-name 
. 
table-name 
AS 
alias 
INDEXED 
BY 
index-name 
NOT 
INDEXED 
 
 
返回子句: 节目 
 
 
RETURNING 
expr 
AS 
column-alias 
* 
, 
 
 
表或子查询: 节目 
 
 
schema-name 
. 
table-name 
AS 
table-alias 
INDEXED 
BY 
index-name 
NOT 
INDEXED 
table-function-name 
( 
expr 
) 
, 
AS 
table-alias 
( 
select-stmt 
) 
( 
table-or-subquery 
) 
, 
join-clause 
 
选择stmt: 节目 
 
 
WITH 
RECURSIVE 
common-table-expression 
, 
SELECT 
DISTINCT 
result-column 
, 
ALL 
FROM 
table-or-subquery 
join-clause 
, 
WHERE 
expr 
GROUP 
BY 
expr 
HAVING 
expr 
, 
WINDOW 
window-name 
AS 
window-defn 
, 
VALUES 
( 
expr 
) 
, 
, 
compound-operator 
select-core 
ORDER 
BY 
LIMIT 
expr 
ordering-term 
, 
OFFSET 
expr 
, 
expr 
 
复合运算符: 节目 
 
 
UNION 
UNION 
INTERSECT 
EXCEPT 
ALL 
 
 
订购条款: 节目 
 
 
expr 
COLLATE 
collation-name 
DESC 
ASC 
NULLS 
FIRST 
NULLS 
LAST 
 
 
结果列: 节目 
 
 
expr 
AS 
column-alias 
* 
table-name 
. 
* 
 
 
窗口定义: 节目 
 
 
( 
base-window-name 
PARTITION 
BY 
expr 
, 
ORDER 
BY 
ordering-term 
, 
frame-spec 
) 
 
框架规格: 节目 
 
 
GROUPS 
BETWEEN 
UNBOUNDED 
PRECEDING 
AND 
UNBOUNDED 
FOLLOWING 
RANGE 
ROWS 
UNBOUNDED 
PRECEDING 
expr 
PRECEDING 
CURRENT 
ROW 
expr 
PRECEDING 
CURRENT 
ROW 
expr 
FOLLOWING 
expr 
PRECEDING 
CURRENT 
ROW 
expr 
FOLLOWING 
EXCLUDE 
CURRENT 
ROW 
EXCLUDE 
GROUP 
EXCLUDE 
TIES 
EXCLUDE 
NO 
OTHERS 
 
 
 
 
 
 
UPDATE 语句用于修改存储在数据库表的零个或多个行中的值的子集,该数据库表由 
 作为 UPDATE 语句的一部分指定
的 限定表名标识。 
2. 细节 如果 UPDATE 语句没有 WHERE 子句,表中的所有行都会被 UPDATE 修改。 否则,UPDATE 仅影响 WHERE 子句布尔表达式为 true 的那些行
 。 如果 WHERE 子句对表中的任何行的计算结果都不为真,这不是错误 - 这仅意味着 UPDATE 语句影响零行。
 
对受 UPDATE 语句影响的每一行所做的修改由 SET 关键字后面的赋值列表确定。 每个赋值 在等号左边指定一个 列名,在右边指定一个标量表达式。 对于每个受影响的行,命名列设置为通过评估相应的标量表达式找到的值。 如果单个列名在赋值表达式列表中出现多次,则除了最右边的出现之外的所有出现都将被忽略。 未出现在分配列表中的列保持不变。 标量表达式可以引用正在更新的行的列。 在这种情况下,所有标量表达式都会在进行任何赋值之前进行评估。
 
从 SQLite 版本 3.15.0  (2016-10-14) 开始,SET 子句中的赋值可以是 
 左侧
带 括号的列名列表和右侧相同大小的 行值 。
 
UPDATE 关键字后面的可选“OR  action  ”冲突子句允许用户指定一个特定的约束冲突解决算法,以在这个 UPDATE 命令期间使用。 有关更多信息,请参阅标题为 ON CONFLICT 的部分。
 
2.1.  CREATE TRIGGER 中更新语句的限制 以下附加语法限制适用于出现在 CREATE TRIGGER 语句主体内的 UPDATE语句。  
 
  在触发器主体中指定为 UPDATE 语句的一部分的 表 名必须是非限定的。 换句话说,
       模式名称 。 触发器中不允许在 UPDATE 的表名上加上前缀。 除非触发器所附加的表在 TEMP 数据库中,否则触发器程序更新的表必须与它驻留在同一个数据库中。 如果触发器附加到的表在 TEMP 数据库中,则正在更新的表的非限定名称将以与顶级语句相同的方式解析(通过首先搜索 TEMP 数据库,然后是主数据库)数据库,然后是按附加顺序排列的任何其他数据库)。
   
触发器内的 UPDATE 语句不允许使用 INDEXED BY 和 NOT INDEXED 子句。 
  无论用于构建 SQLite 的编译选项如何,触发器中都不支持 UPDATE 的 LIMIT 和 ORDER BY 子句。
 
 
2.2.  更新自 UPDATE-FROM 思想是对 SQL 的扩展,它允许 UPDATE 语句由数据库中的其他表驱动。 “目标”表是正在更新的特定表。 使用 UPDATE-FROM,您可以将目标表与数据库中的其他表连接起来,以帮助计算哪些行需要更新以及这些行上应该有哪些新值。 从 SQLite 版本 3.33.0 (2020-08-14) 开始支持 UPDATE-FROM。
 
其他关系数据库引擎也实现了 UPDATE-FROM,但由于构造不是 SQL 标准的一部分,每个产品实现 UPDATE-FROM 的方式不同。 SQLite 实现努力与 PostgreSQL 兼容。 相同想法的 SQL Server 和 MySQL 实现工作方式略有不同。
 
作为 UPDATE-FROM 如何发挥作用的示例,假设您有一个销售点应用程序,它在 SALES 表中累积购买。 在一天结束时,您想要根据每日销售额调整 INVENTORY 表。 为此,您可以针对 INVENTORY 表运行 UPDATE,根据当天的汇总销售额调整数量。 该语句将如下所示:
 
UPDATE inventory
   SET quantity = quantity - daily.amt
  FROM (SELECT sum(quantity) AS amt, itemId FROM sales GROUP BY 2) AS daily
 WHERE inventory.itemId = daily.itemId;
 
FROM 子句中的子查询计算每个 itemId 的库存应减少的数量。 该子查询与库存表连接,每个受影响的库存行的数量减少适当的数量。
 
目标表不包含在 FROM 子句中,除非目的是对目标表进行自连接。 在自连接的情况下,FROM 子句中的表必须别名为与目标表不同的名称。
 
如果目标表和 FROM 子句之间的连接导致同一目标表行有多个输出行,那么只有这些输出行中的一个用于更新目标表。 选择的输出行是任意的,可能会从一个版本的 SQLite 更改为下一个版本,或者从一个运行到下一个运行。
 
2.2.1.  在其他 SQL 数据库引擎中更新 SQL Server 也支持 UPDATE FROM,但在 SQL Server 中,目标表必须包含在 FROM 子句中。 也就是说,目标表在语句中被命名了两次。 使用 SQL Server,上面演示的库存调整语句将这样编写:
 
UPDATE inventory
   SET quantity = quantity - daily.amt
  FROM inventory, 
       (SELECT sum(quantity) AS amt, itemId FROM sales GROUP BY 2) AS daily
 WHERE inventory.itemId = daily.itemId;
 MySQL 支持 UPDATE FROM 思想,但它没有使用 FROM 子句。 相反,完整的连接规范在 UPDATE 和 SET 关键字之间给出。 等效的 MySQL 语句如下所示:
 
UPDATE inventory JOIN
       (SELECT sum(quantity) AS amt, itemId FROM sales GROUP BY 2) AS daily
       USING( itemId )
   SET inventory.quantity = inventory.quantity - daily.amt;
 MySQL UPDATE 语句不像其他系统那样只有一个目标表。 任何参与连接的表都可以在 SET 子句中修改。 MySQL UPDATE 语法允许您一次更新多个表!
 
2.3.  可选的 LIMIT 和 ORDER BY 子句 如果 SQLite 是使用 SQLITE_ENABLE_UPDATE_DELETE_LIMIT 
编译时选项构建的,那么 UPDATE 语句的语法将使用可选的 ORDER BY 和 LIMIT 子句进行扩展,如下所示: 
更新-stmt-限制: 
 
WITH 
RECURSIVE 
common-table-expression 
, 
UPDATE 
OR 
ROLLBACK 
qualified-table-name 
OR 
REPLACE 
OR 
IGNORE 
OR 
FAIL 
OR 
ABORT 
SET 
column-name-list 
= 
expr 
column-name 
, 
FROM 
table-or-subquery 
, 
join-clause 
WHERE 
expr 
returning-clause 
ORDER 
BY 
ordering-term 
, 
LIMIT 
expr 
OFFSET 
expr 
, 
expr 
 
 
如果 UPDATE 语句有 LIMIT 子句,将更新的最大行数是通过计算随附的表达式并将其转换为整数值来找到的。 负值被解释为“无限制”。
 
如果 LIMIT 表达式的计算结果为非负值 N 并且 UPDATE 语句具有 ORDER BY 子句,则在没有 LIMIT 子句的情况下将更新的所有行都将根据 ORDER BY 排序并更新前 N 个。 如果 UPDATE 语句也有一个 OFFSET 子句,那么它会被类似地评估并转换为一个整数值。 如果 OFFSET 表达式的计算结果为非负值 M ,则 
跳过前 M行并更新后面的 N 行。
 
如果 UPDATE 语句没有 ORDER BY 子句,则在应用 LIMIT 和 OFFSET 子句以确定哪些实际更新之前,将以任意顺序组装在没有 LIMIT 子句的情况下更新的所有行。
 
UPDATE 语句上的 ORDER BY 子句仅用于确定哪些行落在 LIMIT 范围内。 修改行的顺序是任意的,不受 ORDER BY 子句的影响。