课程 8.2: UPDATE 语句
在上一课中,我们学习了如何使用 INSERT INTO 添加新行。现在让我们看看如何使用 UPDATE 语句修改已经存在的数据。这是保持数据库最新和准确的关键 DML 操作之一。
基本语法
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
UPDATE table_name— 指定要更改数据的表。SET column = value— 为一个或多个列分配新值。WHERE condition— 确定哪些行将被更新。
重要规则
- 始终使用
WHERE: 如果没有WHERE子句,UPDATE语句将修改表中的每一行。这是最常见和危险的错误之一。 - 数据类型: 新值必须与列的数据类型匹配。
- 字符串和日期: 文本值和日期必须用单引号(
')括起来。 - 数字: 数值不需要引号。
- 事务: 在生产系统中,建议在事务中运行
UPDATE,以便在发生错误时可以回滚更改。
示例
示例 1:更新单个列
让我们更改 customer 表中特定客户的电子邮件地址。
UPDATE customer
SET email = 'new.email@example.com'
WHERE customer_id = 1;
注意:WHERE customer_id = 1 条件确保只有一条特定记录被更改。
示例 2:一次更新多个列
您可以在 SET 子句中列出多个列,用逗号分隔。
UPDATE customer
SET first_name = 'ALICE',
last_name = 'COOPER',
email = 'alice.cooper@example.com'
WHERE customer_id = 42;
示例 3:在表达式中使用当前值
UPDATE 语句允许您根据当前值计算新值。例如,让我们将所有喜剧电影的租金提高 10%:
UPDATE film
SET rental_rate = rental_rate * 1.10
WHERE film_id IN (
SELECT f.film_id
FROM film f
JOIN film_category fc ON f.film_id = fc.film_id
JOIN category c ON fc.category_id = c.category_id
WHERE c.name = 'Comedy'
);
结果:所有喜剧电影的租金将增加 10%。
示例 4:根据条件更新多行
让我们标记所有在某个日期后没有租借任何东西的非活跃客户:
UPDATE customer
SET active = 0
WHERE customer_id NOT IN (
SELECT DISTINCT customer_id
FROM rental
WHERE rental_date >= '2005-08-01'
);
示例 5:将值设置为 NULL
如果列允许 NULL,您可以显式清除它:
UPDATE film
SET original_language_id = NULL
WHERE film_id = 10;
更新前验证
一个好的做法是先运行一个带有相同 WHERE 条件的 SELECT,以确认将受到影响的行:
-- 首先,检查 SELECT 返回的内容
SELECT customer_id, first_name, last_name, email
FROM customer
WHERE customer_id = 1;
-- 只有在验证后,运行 UPDATE
UPDATE customer
SET email = 'new.email@example.com'
WHERE customer_id = 1;
本课的关键要点:
UPDATE语句修改表中现有的行。- 如果没有
WHERE子句,所有行将被更新 — 始终仔细检查它是否存在。 - 可以在单个
SET子句中更新多个列,用逗号分隔。 - 新列值可以根据其当前值计算(例如,
price = price * 1.1)。 - 在运行
UPDATE之前,建议运行一个带有相同条件的SELECT来验证受影响的行。
在下一课中,我们将探讨 DELETE 语句 — 如何安全且有控制地从表中删除行。