SQLite Update 语句

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(数值)
忘记 WHERESELECT 验证
WHERE name = 张三(无引号)WHERE name = '张三'
更新主键不推荐,可能破坏引用

快速参考

操作语法
单列更新SET col = value
多列SET a=1, b=2
表达式SET col = col + 100
条件WHERE id = 1
所有行去掉 WHERE
安全BEGIN; ... COMMIT;

最佳实践

  1. 永远先 SELECT 验证 WHERE
  2. 大批量更新用事务
  3. 避免在列上使用函数(影响索引)
  4. 备份重要表前操作

需要我帮你写一个针对你表的 UPDATE 语句吗?
请提供表结构或字段,我可以生成精准、安全的 SQL!

文章已创建 2305

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部