INSERT语句需显式指定字段名并严格对齐值数量,字符串加引号,避免主键冲突和NOT NULL字段漏填;多行插入用逗号分隔;自增主键可省略但不可传NULL。

INSERT 语句怎么写才不会报错
插入数据最常踩的坑是字段数与值数量不匹配、字符串没加引号、主键冲突或 NOT NULL 字段漏填。INSERT INTO 必须严格对齐列名和值,推荐显式写出字段名,避免表结构变动后代码失效。
- 正确写法:
INSERT INTO users (name, email) VALUES ('张三', 'zhang@example.com'); - 别直接写
INSERT INTO users VALUES (...)—— 字段顺序依赖建表顺序,易出错 - 插入多行用逗号分隔:
INSERT INTO logs (level, msg) VALUES ('INFO', 'start'), ('WARN', 'timeout'); - 如果主键是自增的,
id字段可省略,但不能传NULL或空字符串(除非显式设为DEFAULT)
SELECT 查询结果不对?检查 WHERE 和 NULL 处理
SELECT 看似简单,但实际中大量问题来自条件误判,尤其是涉及 NULL。MySQL 中 NULL 不等于任何值,包括它自己,所以 WHERE status = NULL 永远不成立。
- 查 NULL 要用
IS NULL:SELECT * FROM orders WHERE shipped_at IS NULL; - 模糊匹配记得用
LIKE和通配符:SELECT * FROM products WHERE name LIKE '%手机%'; - 想查“不在某个列表里”,别用
!=连写多个条件,改用NOT IN,但注意:只要NOT IN的子查询含NULL,整条语句返回空结果 - 临时限制数据量调试时,加
LIMIT 10,避免误操作全表扫描卡住
UPDATE 为什么改不动数据
执行 UPDATE 后 Rows matched: 0 是最典型的“看似执行成功实则没生效”。原因通常是 WHERE 条件没命中任何行,而不是语法错误。
- 先用对应
SELECT验证条件是否真能捞出数据:SELECT * FROM users WHERE id = 123;再执行UPDATE users SET name='李四' WHERE id = 123; - 更新时间字段建议用
NOW()而非字符串:UPDATE posts SET updated_at = NOW() WHERE id = 456; - 别在
WHERE里混用函数处理索引字段,比如WHERE DATE(created_at) = '2024-01-01'会让索引失效 - 生产环境执行前,确保开了
AUTOCOMMIT=0并手动BEGIN,方便出错时ROLLBACK
DELETE 误删怎么办?从安全习惯开始
没有 WHERE 的 DELETE FROM table_name 会清空全表,且不可回退(除非有备份或 binlog)。哪怕加了 WHERE,也可能因条件太宽误删多行。
- 永远先写
SELECT模拟要删的数据:SELECT id, name FROM archives WHERE created_at - 确认无误后再把
SELECT改成DELETE,并限定范围:DELETE FROM archives WHERE created_at - 开发机上建议给
DELETE加SQL_SAFE_UPDATES=1(默认开启),它会拒绝没有 KEY 条件或没用 LIMIT 的 DELETE/UPDATE - 真正危险的不是语法,而是连接到了线上库却没意识到——检查当前数据库名:
SELECT DATABASE();
实际项目里,CRUD 的复杂度往往不在语句本身,而在于事务边界、字符集隐式转换、时区设置导致的时间字段偏差,还有客户端驱动对 NULL 和空字符串的不同处理。这些点不报错,但会让数据逻辑悄悄偏离预期。










