数据库中的数据会变化:用户修改邮箱,商品调整价格,订单从 pending 变成 paid。UPDATE 不新增 Row,而是在已有数据上修改一个或多个 Column。
UPDATE users 指定表,SET email = ... 指定新值,WHERE id = 1 选择目标 Row。执行后只有 Alice 变化。
UPDATE users
SET email = '[email protected]'
WHERE id = 1;WHERE 在 UPDATE 中非常重要
UPDATE users SET city = 'Tokyo'; 会把所有 Row 的 city 都覆盖为 Tokyo。只差一行 WHERE,影响范围就可能从一个用户变成几千个用户。执行前必须知道条件会匹配什么。
先 SELECT,再 UPDATE
把准备使用的 WHERE 先放进 SELECT。确认返回的 Row 正是目标后,再执行 UPDATE。这多花几秒钟,却能显著减少误操作。
一次修改多个 Column 或 Row
SET 后可以用逗号分隔多个赋值,例如同时更新 Bob 的 email 和 city。WHERE 也可能匹配多条 Row;若两个用户都在 Tokyo,WHERE city = 'Tokyo' 会修改两人。数据库工具显示的“2 rows affected”是重要反馈。
根据当前值计算
新值可以基于旧值,例如 SET price = price + 10,或对 Electronics 使用 price = price * 1.10。无 WHERE 时所有商品都会变化。
写入 NULL
SET city = NULL 写入缺失值;SET city = 'NULL' 写入普通文字,两者完全不同。修改后再次 SELECT 检查目标 Row。
UPDATE users
SET email = '[email protected]',
city = 'Tokyo'
WHERE id = 2;修改目标 Row,并看见影响范围
运行 UPDATE 后数据会持续变化。对比精确 WHERE、宽条件和省略 WHERE 时的 affected rows。
| id | name | city | |
|---|---|---|---|
| 1 | Alice | [email protected] | Tokyo |
| 2 | Bob | [email protected] | Osaka |
| 3 | Chris | [email protected] | Tokyo |
| 4 | Diana | [email protected] | Kyoto |
沙盒已准备好,不会连接真实数据库。知识测验
用 WHERE 安全修改数据
完成两项:
① 把 id 为 2 的 Mouse 价格改为 45.00;
② 把 Electronics 商品价格提高 10%,但不得影响其他类别。每项先写预览用 SELECT,再写 UPDATE,最后写验证用 SELECT。说明预期 affected rows。
可选:通用练习数据
DROP TABLE IF EXISTS products;
CREATE TABLE products (id INTEGER, name VARCHAR(100), price DECIMAL(10,2), category VARCHAR(50));
INSERT INTO products VALUES
(1,'Keyboard',80.00,'Electronics'), (2,'Mouse',40.00,'Electronics'),
(3,'Coffee Mug',15.00,'Home'), (4,'Backpack',60.00,'Fashion');