MySQL UPDATE 用法与实例

在本文中,我们讨论了在 MySQL 中使用 UPDATE 语句更新表中的数据。

如果想要更新表中的已有的数据行,需要使用到 UPDATE 语句。

UPDATE 语法

UPDATE 语句可以更新表中的一行或者多行数据,可以更新表中的一个或者多个字段(列)。 以下是 UPDATE 语句的基本语法:

UPDATE [IGNORE] table_name
SET
    column_name1 = value1,
    column_name2 = value2,
    ...
[WHERE clause];

用法说明:

  • UPDATE 关键字后指定要更新数据的表名。
  • 使用 SET 子句设置字段的新值。多个字段使用逗号分隔。字段的值可以是普通的字面值,也可以是表达式运算,还可以是子查询。
  • 使用 WHERE 子句指定要更新的行。只有符合 WHERE 条件的行才会被更新。
  • WHERE 子句是可选的。如果不指定 WHERE 子句,则更新表中的所有行。

UPDATE 语句中的 WHERE 子句非常重要。除非您特意,否则不要省略 WHERE 子句。

UPDATE 实例

下面我们将通过几个实例来展示 UPDATE 的具体用法。

在以下实例中,我们使用 Sakila 示例数据库中的 customer 进行演示。

使用 UPDATE 修改单列值

在这个例子中,我们将把 customer_id 等于 1 的客户的电子邮件修改为 [email protected]

  1. 使用以下 SELECT 语句查看更新前的数据。

    SELECT first_name, last_name, email
    FROM customer
    WHERE customer_id = 1;
    
    +------------+-----------+-------------------------------+
    | first_name | last_name | email                         |
    +------------+-----------+-------------------------------+
    | MARY       | SMITH     | [email protected] |
    +------------+-----------+-------------------------------+
    1 row in set (0.00 sec)
  2. 使用以下 UPDATE 语句更新 email 字段的值。

    UPDATE customer
    SET email = '[email protected]'
    WHERE customer_id = 1;
    
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1  Changed: 1  Warnings: 0

    在此 UPDATE 语句中:

    • 通过 WHERE 子句指定更新的条件为 customer_id = 1
    • 通过 SET 子句将 email 列的值设置为新电子邮件。

    UPDATE 输出的结果中:

    • 1 row affected 表示 1 行数据受影响。也就是更新了 1 行数据。
    • Rows matched: 1 表示匹配的 WHERE 条件的行数是 1。
    • Changed: 1 表示修改的行数是 1。
    • Warnings: 0 表示没有需要注意的事项。
  3. 使用以下 SELECT 语句查看更新后的数据,以验证是否更新成功。

    SELECT first_name, last_name, email
    FROM customer
    WHERE customer_id = 1;
    
    +------------+-----------+-----------------------------------+
    | first_name | last_name | email                             |
    +------------+-----------+-----------------------------------+
    | MARY       | SMITH     | [email protected] |
    +------------+-----------+-----------------------------------+
    1 row in set (0.01 sec)

使用 UPDATE 修改多列值

在这个例子中,我们将同时更新 customer_id 等于 1 的客户的 first_name, last_name, email

UPDATE customer
SET first_name = 'Tim',
    last_name = 'Duncan',
    email = '[email protected]'
WHERE customer_id = 1;

然后,我们再次验证更新后的数:

SELECT first_name, last_name, email
FROM customer
WHERE customer_id = 1;
+------------+-----------+-------------------------------+
| first_name | last_name | email                         |
+------------+-----------+-------------------------------+
| Tim        | Duncan    | [email protected] |
+------------+-----------+-------------------------------+
1 row in set (0.00 sec)

使用表达式更新

使用 UPDATE 更新时,字段的值可以设置为表达式的运算结果,比如函数或其他的运算。

下面的 UPDATE 更新所有客户的电子邮件的域名部分:

UPDATE customer
SET email = REPLACE(email, 'sakilacustomer.org', 'sjkjc.com');
Query OK, 599 rows affected (0.03 sec)
Rows matched: 599  Changed: 599  Warnings: 0

注意,本例中没有使用 WHERE 子句,所以表中所有的数据都进行了更新。

使用子查询更新

下面实例展示了如何为没有绑定商店的客户绑定一个随机商店。

UPDATE customer
SET store_id = (
    SELECT store_id
    FROM store
    ORDER BY RAND()
    LIMIT 1
  )
WHERE store_id IS NULL;

在本例中,我们通过以下 SELECT 语句返回一个随机的商店 id:

SELECT store_id
FROM store
ORDER BY RAND()
LIMIT 1

SET 子句中,将 store_id 的值设置为上面的子查询。

UPDATE 修饰符

在 MySQL 中, UPDATE 语句支持 2 个修饰符:

  • LOW_PRIORITY: 如果你指定了 LOW_PRIORITY 修饰符,MySQL 服务器将延迟执行 UPDATE 操作直到没有客户端对表进行读操作。

    LOW_PRIORITY 修饰符影响那些只支持表级锁的存储引擎,比如: MyISAM, MEMORY, 和 MERGE

  • IGNORE: 如果你指定了 IGNORE 修饰符,MySQL 服务器会在执行 UPDATE 操作期间忽略那些可忽略的错误。这些错误最终会作为 WARNING 返回。

修饰符的用法如下:

UPDATE [LOW_PRIORITY] [IGNORE] table_name SET column_name = value

结论

在本文中,我们通过实例介绍了在 MySQL 中使用 UPDATE 语句从表中删除满足条件的记录行。以下是 UPDATE 语句的要点:

  • UPDATE 语句可以更新表中的一行或者多行数据,可以更新表中的一个或者多个字段。
  • 使用 SET 子句设置字段的新值。多个字段使用逗号分隔。字段的值可以是普通的字面值,也可以是表达式运算,还可以是子查询。
  • 使用 WHERE 子句指定要更新的行。只有符合 WHERE 条件的行才会被更新。
  • WHERE 子句是可选的。如果不指定 WHERE 子句,则更新表中的所有行。请不要省略 WHERE 子句,除非你知道要做什么。
  • UPDATE 语句支持的修饰符有:LOW_PRIORITYIGNORE。如果想忽略一些错误行,可使用 IGNORE 标识符。