Small. Fast. Reliable.
Choose any three.
更新

1.概述

update-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

列名列表:

common-table-expression:

expr:

加盟条款:

限定表名称:

返回条款:

表或子查询:

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

2.细节

如果UPDATE语句没有WHERE子句,则UPDATE将修改表中的所有行。否则,UPDATE仅影响那些WHERE子句 布尔表达式为true的行。如果表中的任何行的WHERE子句的评估结果都不为true,则不是错误-这仅表示UPDATE语句影响零行。

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

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

UPDATE关键字后面的可选“ OR操作”冲突子句允许用户指定在此UPDATE命令期间要使用的特定约束冲突解决算法。有关更多信息,请参阅标题为“冲突”。

2.1。CREATE TRIGGER中对UPDATE语句的限制

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

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表运行UPDATE,该表根据当日的总销售额来调整数量。该语句如下所示:

更新库存
   设置数量=数量-Daily.amt
  每日(来自(选择总和(数量)AS的amt,来自销售GROUP BY 2的itemId)
 在哪里stock.itemId = daily.itemId;

FROM子句中的子查询计算应减少每个itemId的库存量。该子查询针对库存表进行联接,并且每个受影响的库存行的数量都减少了适当的数量。

目标表不包含在FROM子句中,除非目的是针对目标表进行自联接。如果是自联接,则FROM子句中的表必须使用别名别名,而不是目标表的别名。

如果目标表和FROM子句之间的联接导致同一目标表行有多个输出行,则仅将这些输出行之一用于更新目标表。所选的输出行是任意的,并且可能从一个SQLite版本更改为下一个版本,或从一个运行版本更改为下一个运行版本。

2.2.1。其他SQL数据库引擎中的UPDATE FROM

SQL Server还支持UPDATE FROM,但是在SQL Server中,目标表必须包含在FROM子句中。换句话说,目标表在语句中被命名两次。使用SQL Server,上面演示的库存调整声明将这样写:

更新库存
   设置数量=数量-Daily.amt
  从库存 
       (选择总和(数量)AS amt,来自sales GROUP BY 2的itemId)每天AS
 在哪里stock.itemId = daily.itemId;

MySQL支持UPDATE FROM想法,但是它不需要使用FROM子句。而是在UPDATE和SET关键字之间给出完整的连接规范。等效的MySQL语句如下所示:

更新库存加入
       (选择总和(数量)AS amt,来自sales GROUP BY 2的itemId)每天AS
       使用(itemId)
   SET库存量=库存量-Daily.amt;

MySQL UPDATE语句不像其他系统那样只有一个目标表。可以在SET子句中修改参与联接的任何表。MySQL UPDATE语法允许您一次更新多个表!

2.3。可选的LIMIT和ORDER BY子句

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

update-stmt-limited:

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子句,则将根据ORDER BY对所有在没有LIMIT子句的情况下将要更新的行进行排序,并更新第一个N。如果UPDATE语句还具有OFFSET子句,则将类似地对其进行评估并将其转换为整数值。如果OFFSET表达式的计算结果为非负值M,那么将 跳过前M行,而更新随后的N行。

如果UPDATE语句没有ORDER BY子句,则在应用LIMIT和OFFSET子句以确定实际更新的行之前,将在没有LIMIT子句的情况下将要更新的所有行进行汇编。

UPDATE语句上的ORDER BY子句仅用于确定哪些行在LIMIT之内。修改行的顺序是任意的,不受ORDER BY子句的影响。