UPDATE

语法

单表更新语法:

UPDATE [LOW_PRIORITY] [IGNORE] table_reference 
  [PARTITION (partition_list)]
  SET col1={expr1|DEFAULT} [,col2={expr2|DEFAULT}] ...
  [WHERE where_condition]
  [ORDER BY ...]
  [LIMIT row_count]

多表更新语法:

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET col1={expr1|DEFAULT} [, col2={expr2|DEFAULT}] ...
    [WHERE where_condition]

描述

对于单表更新的语法,UPDATE语句更新指定的字段为新的值。其中SET子句指定要修改哪些字段以及修改为哪些值。 每个值都可以是一个表达式,或者使用关键字DEFAULT来表示将该字段的值设置为默认值。如果给定了WHERE子句,则筛选出哪些行会更新。如果没有WHERE子句,则会更新所有的行。如果给定了ORDER BY子句,则会按照排序的顺序更新每一行。如果给定了LIMIT子句,这表示只更新一定数量的行。

MariaDB starting with 10.0

PARTITION子句是MariaDB 10.0开始引入的新功能,详细信息见Partition Pruning and Selection

对于多表更新,直到MariaDB 10.3.2UPDATE会更新table_references中所有满足条件的表。这种情况下,不能使用ORDER BYLIMIT子句。从MariaDB 10.3.2开始,该限制被取消了,在多表更新语句中可以使用上述两种子句。在一个UPDATE语句中可以引用多张表,即使这些表位于不同的数据库中。详细内容见Identifier Qualifiers

where_condition用于筛选哪些行需要被更新。

table_referenceswhere_condition的指定方式与SELECT中提到的指定方式一样。

多个赋值语句是从左到右评估的,除非sql_mode指定了SIMULTANEOUS_ASSIGNMENT模式(从MariaDB 10.3.5开始支持该模式),这种情况下UPDATE语句是同时评估所有赋值语句的。(译注:标准SQL是赋值是同时性的)

/* 译注: 例如,给定如下表:*/
DROP TABLE tx;
CREATE TABLE tx (c1 INT, c2 INT);
INSERT INTO tx VALUES (10,10);

/* 下面的update能正确执行,更新后c2字段的值和c1的值相同 */
UPDATE tx SET c1=c1+1,c2=c1;

/* 设置sql_mode模式SIMULTANEOUS_ASSIGNMENT,再执行相同的更新语句,
 *  由于同时评估各赋值语句,所以更新后c1的值会加1,c2的值等于更新前的c1
*/
SET @@sql_mode=CONCAT(@@sql_mode,',SIMULTANEOUS_ASSIGNMENT');
UPDATE tx SET c1=c1+1,c2=c1;

UPDATE字段时,需要拥有该字段的UPDATE权限。但对于没有更新的字段需要具有SELECT权限。见GRANT

UPDATE语句支持以下修饰符:

  • 如果指定了关键字LOW_PRIORITY,则UPDATE操作会延迟执行,直到没有其他客户端读取该表。该修饰符只会影响那些只使用表级锁的存储引擎(MyISAM、MEMORY、MERGE)。详细内容见:HIGH_PRIORITY和LOW_PRIORITY子句
  • 如果指定了IGNORE关键字,则会忽略更新时的错误。也就是说,更新时发生错的时候update不会立即中断,而是会继续对后面的内容进行更新。所以不会更新有重复值冲突的数据行。、

源和目标相同的UPDATE语句

MariaDB starting with 10.3.2

MariaDB 10.3.2开始,UPDATE语句可以使用相同的源和目标。

例如,给定如下表:

DROP TABLE t1;
CREATE TABLE t1 (c1 INT, c2 INT);
INSERT INTO t1 VALUES (10,10), (20,20);

直到MariaDB 10.3.1,下面的UPDATE语句都无法执行:

UPDATE t1 SET c1=c1+1 WHERE c2=(SELECT MAX(c2) FROM t1);
ERROR 1093 (HY000): Table 't1' is specified twice, 
  both as a target for 'UPDATE' and as a separate source for data

MariaDB 10.3.2开始,该语句可以正确地执行:

UPDATE t1 SET c1=c1+1 WHERE c2=(SELECT MAX(c2) FROM t1);

SELECT * FROM t1;
+------+------+
| c1   | c2   |
+------+------+
|   10 |   10 |
|   21 |   20 |
+------+------+

示例

单表更新:

UPDATE table_name SET column1 = value1, column2 = value2 WHERE id=100;

多表更新:

UPDATE tab1, tab2 SET tab1.column1 = value1, tab1.column2 = value2 WHERE tab1.id = tab2.id;

See Also

Comments

Comments loading...
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.