必须用is null或is not null判断null,因= null返回unknown被where过滤;正确写法仅where col is null,不可用=、!=或in;空字符串需额外or col = ''。

UPDATE 语句中如何正确判断 NULL
不能用 = NULL 或 != NULL,因为 NULL 在 SQL 中不参与常规比较运算,任何与 NULL 的等值比较都返回 UNKNOWN,结果被当作 false 处理。必须用 IS NULL 或 IS NOT NULL。
- 错误写法:
WHERE status = NULL→ 永远不匹配任何行 - 正确写法:
WHERE status IS NULL - 如果字段允许空字符串(
'')且你也想覆盖它,需额外加条件:WHERE status IS NULL OR status = ''
只更新特定字段、不影响其他列
UPDATE 语句默认只修改 SET 子句中列出的字段,其余字段保持原值。只要别在 SET 后面多写无关字段,就不会误改数据。
- 安全示例:
UPDATE users SET name = 'unknown' WHERE id = 123 AND name IS NULL - 风险操作:
UPDATE users SET name = 'unknown', email = '' WHERE ...→ 会清空 email,即使原值非 NULL - 建议在执行前先用 SELECT 验证目标行:
SELECT id, name FROM users WHERE name IS NULL LIMIT 5
批量更新时注意 WHERE 条件的精确性
漏加 WHERE 或条件太宽,容易误更新大量记录。NULL 值常出现在可选字段(如 phone、address),但业务上可能只希望补全某类用户。
- 推荐组合条件:
WHERE phone IS NULL AND user_type = 'premium' - 避免无限制更新:
WHERE phone IS NULL(除非你真要扫全表) - 某些数据库(如 MySQL)在严格模式下,对包含 NULL 的 UPDATE 可能触发警告;PostgreSQL 则更严格,但逻辑一致
UPDATE … FROM 或子查询场景下的 NULL 判断
当需要根据另一张表的数据来更新 NULL 字段时,JOIN 后的字段仍需用 IS NULL 判断,不能依赖 JOIN 条件自动过滤。
- 常见错误:写
LEFT JOIN orders o ON u.id = o.user_id WHERE o.amount IS NULL→ 实际匹配的是没订单的用户,而非订单金额为 NULL 的记录 - 正确做法(若 amount 允许 NULL):
WHERE o.amount IS NULL AND o.user_id IS NOT NULL,或更稳妥地明确来源:WHERE u.phone IS NULL AND u.created_at > '2024-01-01' - MySQL 不支持
UPDATE ... FROM语法,得用 JOIN 形式;PostgreSQL 和 SQL Server 支持,但 NULL 判断规则不变










