文章目录

sql update语句用法详解

UPDATE 是修改表中的行的DML (Data Manipulation Language 数据操作语言)语句。

单表语法:

UPDATE [LOW_PRIORITY] [IGNORE] table_reference
    SET assignment_list
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

value:
    {expr | DEFAULT}

assignment:
    col_name = value

assignment_list:
    assignment [, assignment] ...

多表语法:

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET assignment_list
    [WHERE where_condition]

对于单表语法,该 UPDATE语句使用新值更新指定表中现有行的列。该 SET子句指出要修改哪些列以及应该给出哪些值。

每个值都可以作为表达式给出,或者关键字DEFAULT将列明确地设置为默认值。该 WHERE子句(如果给出)指定标识要更新哪些行的条件。

没有 WHERE子句,所有行都被更新。如果ORDER BY指定了 子句,则按照指定的顺序更新行。该 LIMIT子句对可更新的行数设置了限制。

对于多表语法, UPDATE更新在其中命名的每个表中的行table_references满足条件。即使匹配条件多次,每个匹配的行也会更新一次。对于多表语法, ORDER BY并LIMIT不能使用。

where_condition是一个表达式,每一行都被更新为true。

该UPDATE语句支持以下修饰符:

  • 使用LOW_PRIORITY修饰符,执行UPDATE延迟,直到没有其他客户从表中读取。这会影响只使用表级锁只存储引擎(例如 MyISAM,MEMORY和MERGE)。

  • 使用IGNORE修饰符,即使更新期间发生错误,update语句也不会中止。在唯一键值上发生重复键冲突的行不会更新。行更新为可能导致数据转换错误的值将更新为最接近的有效值。

在MySQL 5.5.18及更高版本中, UPDATE IGNORE 语句(包括具有ORDER BY 子句的语句)被标记为不安全的基于语句的复制。(这是因为更新行的顺序决定了哪些行被忽略。)当使用基于语句的模式时,这些语句会在错误日志中产生警告,并在使用MIXED模式时使用基于行的格式写入二进制日志 。

如果从表中访问表中要更新UPDATE的列,请使用列的当前值。例如,以下语句设置 col1为比当前值多一个:

UPDATE t1 SET col1 = col1 + 1;

以下语句中的第二个分配设置 col2为当前(更新)的 col1值,而不是原始 col1值。结果是, col1并col2具有相同的价值。这种行为不同于标准的SQL。

UPDATE t1 SET col1 = col1 + 1, col2 = col1;

单表UPDATE分配通常从左到右进行评估。对于多表更新,不能保证按任何特定顺序执行分配。

如果您将列设置为当前的值,MySQL会注意到这一点,并不会更新它。

如果NOT NULL通过设置更新已声明的列,则在NULL严格SQL模式启用时会发生错误; 否则,列设置为列数据类型的隐式默认值,并且警告计数递增。隐式默认值为 0数字类型,字符串类型为空字符串('') ,日期和时间类型为“ 零 ”值。

UPDATE返回实际更改的行数。在 mysql_info()C API函数返回被匹配和更新的行数,并在发生警告的数量 UPDATE。

你可以用来限制的范围。一个 子句是一个行匹配的限制。只要发现满足该子句的行, 语句就会停下来 ,不管它们是否真的发生了变化。

如果一个UPDATE语句包含一个 ORDER BY子句,则这些行将按照该子句指定的顺序更新。这在某些情况下可能会有用,否则可能会导致错误。假设一个表t包含一个id 具有唯一索引的列。以下语句可能会因重复键错误而失败,具体取决于更新行的顺序:

UPDATE t SET id = id + 1;

例如,如果该表在id列中包含1和2, 在2更新为3之前1更新为2,则会发生错误。为避免此问题,请添加一个 ORDER BY子句,使较大id值的行在具有较小值的行 之前更新:

UPDATE t SET id = id + 1 ORDER BY id DESC;

您也可以执行UPDATE 覆盖多个表的操作。但是,您不能使用 ORDER BY或LIMIT与多个表UPDATE。该 table_references子句列出了连接中涉及的表。其语法在 第13.2.9.2节“JOIN语法”中描述。这里是一个例子:

UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;

前面的示例显示了使用逗号运算符的内部联接,但多个表UPDATE 语句可以使用语句中允许的任何类型的联接 SELECT,例如 LEFT JOIN。

如果使用UPDATE 涉及InnoDB有外键约束的表的多表语句,MySQL优化器可能会按照与其父/子关系不同的顺序来处理表。

在这种情况下,语句失败并回滚。相反,更新单个表并依赖提供的 ON UPDATE功能 InnoDB来使其他表相应地被修改。

您无法更新表并从子查询中的同一个表中进行选择。

一个UPDATE使用的存储引擎,诸如分区表MyISAM,其使用表级锁锁定表中的所有分区。对于使用存储引擎(如InnoDB使用行级锁定)的表,不会发生这种情况 。

本文网址:http://www.santii.com/article/157.html


数据更新时间:2018-11-14