SQLite 的 UPDATE 语句 用于修改表中已存在的数据。可以更新一行、多行或所有行。
基本语法
UPDATE table_name
SET column1 = value1, column2 = value2, ...
[WHERE condition];
SET:指定要更新的列和值WHERE:可选,决定更新哪些行- 无
WHERE→ 更新所有行 - 有
WHERE→ 只更新满足条件的行
示例表结构
CREATE TABLE employees (
id INTEGER PRIMARY KEY,
name TEXT,
department TEXT,
salary REAL,
bonus REAL DEFAULT 0,
status TEXT DEFAULT 'active', -- 'active', 'inactive'
updated_at DATETIME
);
-- 插入测试数据
INSERT INTO employees (id, name, department, salary, bonus, status) VALUES
(1, '张三', 'IT', 8000, 500, 'active'),
(2, '李四', 'HR', 6000, 300, 'active'),
(3, '王五', 'IT', 9500, 800, 'inactive'),
(4, '赵六', 'Finance', 7200, 0, 'active');
1. 基本更新单列
-- 给 ID=1 的员工涨薪 10%
UPDATE employees
SET salary = salary * 1.1
WHERE id = 1;
2. 更新多列
-- 同时更新部门和奖金
UPDATE employees
SET department = 'R&D',
bonus = 1000,
updated_at = CURRENT_TIMESTAMP
WHERE name = '李四';
3. 使用表达式更新
-- 所有 IT 部门员工奖金 +200
UPDATE employees
SET bonus = bonus + 200
WHERE department = 'IT';
-- 状态为 inactive 的员工,薪资降 15%
UPDATE employees
SET salary = ROUND(salary * 0.85, 2)
WHERE status = 'inactive';
4. 条件更新(WHERE 的重要性!)
| 场景 | 代码 |
|---|---|
| 仅更新特定行 | WHERE id = 3 |
| 更新多个条件 | WHERE department = 'IT' AND salary < 9000 |
| 模糊匹配 | WHERE name LIKE '张%' |
| 范围 | WHERE salary BETWEEN 6000 AND 8000 |
-- 仅更新 HR 部门且在职的员工
UPDATE employees
SET bonus = 400
WHERE department = 'HR' AND status = 'active';
5. 危险操作:无 WHERE 更新所有行
-- 所有员工薪资 +1000(谨慎!)
UPDATE employees SET salary = salary + 1000;
建议:先用
SELECT验证WHERE条件!
-- 先检查
SELECT * FROM employees WHERE department = 'IT';
-- 确认无误后再 UPDATE
UPDATE employees SET bonus = 500 WHERE department = 'IT';
6. 使用 CASE 实现条件赋值
-- 根据部门设置不同奖金
UPDATE employees
SET bonus = CASE
WHEN department = 'IT' THEN 1000
WHEN department = 'Finance' THEN 800
ELSE 300
END;
7. 更新时自动记录时间
UPDATE employees
SET salary = 8500,
updated_at = DATETIME('now')
WHERE id = 2;
推荐:为
updated_at列设置触发器自动更新
CREATE TRIGGER update_timestamp
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
UPDATE employees SET updated_at = DATETIME('now') WHERE id = OLD.id;
END;
8. 结合子查询更新
-- 将薪资低于部门平均值的员工,调至平均值
UPDATE employees
SET salary = (
SELECT AVG(salary)
FROM employees e2
WHERE e2.department = employees.department
)
WHERE salary < (
SELECT AVG(salary)
FROM employees e3
WHERE e3.department = employees.department
);
9. 安全更新:事务 + 备份
-- 开启事务
BEGIN TRANSACTION;
-- 更新
UPDATE employees SET department = 'Engineering' WHERE department = 'IT';
-- 检查结果
SELECT * FROM employees;
-- 满意则提交,不满意就回滚
COMMIT;
-- 或 ROLLBACK;
10. 常见错误
| 错误 | 正确做法 |
|---|---|
SET salary = '8000'(字符串) | SET salary = 8000(数值) |
忘记 WHERE | 先 SELECT 验证 |
WHERE name = 张三(无引号) | WHERE name = '张三' |
| 更新主键 | 不推荐,可能破坏引用 |
快速参考
| 操作 | 语法 |
|---|---|
| 单列更新 | SET col = value |
| 多列 | SET a=1, b=2 |
| 表达式 | SET col = col + 100 |
| 条件 | WHERE id = 1 |
| 所有行 | 去掉 WHERE |
| 安全 | BEGIN; ... COMMIT; |
最佳实践
- 永远先
SELECT验证WHERE - 大批量更新用事务
- 避免在列上使用函数(影响索引)
- 备份重要表前操作
需要我帮你写一个针对你表的 UPDATE 语句吗?
请提供表结构或字段,我可以生成精准、安全的 SQL!