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]
Contents
描述
对于单表更新的语法,UPDATE
语句更新指定的字段为新的值。其中SET
子句指定要修改哪些字段以及修改为哪些值。 每个值都可以是一个表达式,或者使用关键字DEFAULT
来表示将该字段的值设置为默认值。如果给定了WHERE
子句,则筛选出哪些行会更新。如果没有WHERE
子句,则会更新所有的行。如果给定了ORDER BY子句,则会按照排序的顺序更新每一行。如果给定了LIMIT子句,这表示只更新一定数量的行。
MariaDB starting with 10.0
PARTITION子句是MariaDB 10.0开始引入的新功能,详细信息见Partition Pruning and Selection。
对于多表更新,直到MariaDB 10.3.2,UPDATE
会更新table_references中所有满足条件的表。这种情况下,不能使用ORDER BY和LIMIT子句。从MariaDB 10.3.2开始,该限制被取消了,在多表更新语句中可以使用上述两种子句。在一个UPDATE
语句中可以引用多张表,即使这些表位于不同的数据库中。详细内容见Identifier Qualifiers 。
where_condition
用于筛选哪些行需要被更新。
table_references
和where_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;