首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

UPDATE

【置顶】

UPDATE(更新)

update-stmt: 隐藏

column-name-list: 展示

expr:展示

literal-value: 展示

raise-function: 展示

select-stmt: 展示

common-table-expression: 展示

compound-operator: 展示

join-clause: 展示

join-constraint: 展示

join-operator: 展示

ordering-term: 展示

result-column: 展示

table-or-subquery: 展示

type-name: 展示

signed-number: 展示

qualified-table-name: 展示

with-clause: 展示

cte-table-name: 展示

select-stmt: 展示

common-table-expression: 展示

compound-operator: 展示

join-clause: 展示

join-constraint: 展示

join-operator: 展示

ordering-term: 展示

result-column: 展示

table-or-subquery: 展示

UPDATE 语句用于修改存储在由作为 UPDATE 语句的一部分指定的 qualified-table-name 标识的数据库表的零个或多个行中的值的子集。

如果 UPDATE 语句没有 WHERE 子句,则表中的所有行均由 UPDATE 修改。否则,UPDATE 仅影响 WHERE 子句布尔表达式为真的那些行。如果 WHERE 子句对于表中的任何行都不计算为真,这并不是错误 - 这只是表示 UPDATE 语句会影响零行。

受 UPDATE 语句影响的每行的修改由 SET 关键字后面的赋值列表确定。每个赋值指定等号左边的列名称和右边的标量表达式。对于每个受影响的行,将命名列设置为通过评估相应标量表达式找到的值。如果单个列名在赋值表达式列表中多次出现,则忽略除最右侧的所有事件以外的所有事件。没有出现在分配列表中的列未被修改。标量表达式可能涉及正在更新的行的列。在这种情况下,所有标量表达式在进行任何分配之前都会被评估。

从SQLite 版本3.15.0(2016-10-14)开始,SET子句中的赋值可以是左侧列表名称的列表以及右侧相同大小的行值。

在 UPDATE 关键字后面的可选 “OR action ” 冲突条款允许用户在这一个 UPDATE 命令期间提名特定的约束冲突解决算法。有关更多信息,请参阅标题为 “CONFLICT” 的部分。

CREATE TRIGGER 中 UPDATE 语句的限制

以下附加语法限制适用于在 CREATE TRIGGER 语句的主体内发生的 UPDATE 语句。

  • 在触发器体内指定为 UPDATE 语句的一部分的表名必须是不合格的。换句话说,模式名称触发器中不允许在 UPDATE 表名上使用前缀。除非触发器附加到的表位于 TEMP 数据库中,否则由触发器程序更新的表必须与它位于同一个数据库中。如果触发器附加到的表位于 TEMP 数据库中,那么正在更新的表的非限定名称将按照与顶级语句相同的方式进行解析(首先搜索 TEMP 数据库,然后再搜索主数据库,然后是任何其他数据库按照它们附加的顺序)。
  • 触发器中的 UPDATE 语句不允许 INDEXED BY 和 NOT INDEXED 子句。
  • 无论用于构建SQLite的编译选项如何,触发器都不支持 UPDATE 的 LIMIT 和 ORDER BY 子句。

可选的LIMIT和ORDER BY子句

如果 SQLite 是使用 SQLITE_ENABLE_UPDATE_DELETE_LIMIT 编译时选项构建的,那么 UPDATE 语句的语法将扩展为可选的 ORDER BY 和 LIMIT 子句,如下所示:

update-stmt-limited:

如果 UPDATE 语句具有 LIMIT 子句,则通过评估随附的表达式并将其转换为整数值来找到将要更新的最大行数。负值被解释为“no 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 B子句的影响。

 SQLite is in the Public Domain.

扫码关注腾讯云开发者

领取腾讯云代金券