直接用DEFAULT关键字可显式触发默认值,如INSERT INTO t (a,b) VALUES (1,DEFAULT);省略字段或写NULL均不触发默认值,反而可能导致NULL插入或报错。

直接用 DEFAULT 关键字就能插入定义好的默认值,但必须显式写出这个词——不能留空、不能用 NULL 代替,否则可能触发非预期行为。
INSERT 语句中写 DEFAULT 的正确姿势
只有在 INSERT ... VALUES(...) 或 INSERT ... SELECT 中,把 DEFAULT 当作“值”来写,数据库才会真正代入列的默认表达式(比如 CURRENT_TIMESTAMP、0、'unknown')。
常见错误是留空字段或传 NULL,这会导致:
– 留空(字段不出现):该列被跳过,若没设 NOT NULL 可能存 NULL;
– 显式写 NULL:强制存 NULL,哪怕该列有 DEFAULT 'N/A' 也无效。
- ✅ 正确:
INSERT INTO users (name, created_at) VALUES ('Alice', DEFAULT); - ❌ 错误:
INSERT INTO users (name) VALUES ('Alice');(created_at被跳过,可能为NULL) - ❌ 错误:
INSERT INTO users (name, created_at) VALUES ('Alice', NULL);(覆盖默认值)
DEFAULT 对不同数据类型的兼容性差异
不是所有类型都能安全用 DEFAULT,尤其涉及表达式时,行为因数据库而异:
-
TIMESTAMP/DATETIME:MySQL 支持DEFAULT CURRENT_TIMESTAMP,但 PostgreSQL 要写DEFAULT NOW();SQL Server 用DEFAULT GETDATE() -
IDENTITY/SERIAL列:PostgreSQL 允许DEFAULT插入下一个序列值;SQL Server 要用DEFAULT或省略字段(但省略字段 ≠DEFAULT) -
JSON类型:SQLite 不支持DEFAULT表达式,只能设DEFAULT NULL;PostgreSQL 支持DEFAULT '{}'::json
关键点:DEFAULT 是语法关键字,不是函数,不能加括号,也不能带参数。
UPDATE 里也能用 DEFAULT,但容易被忽略
很多人只记得 INSERT 用 DEFAULT,其实 UPDATE 同样支持,且更实用——比如重置某个配置字段回初始值:
- ✅
UPDATE settings SET value = DEFAULT WHERE key = 'theme'; - ⚠️ 注意:如果该列定义是
DEFAULT NULL,那这条语句就等于设成NULL,不是“清空”或“删除” - ⚠️ SQLite 不支持
UPDATE ... SET col = DEFAULT,会报错near "DEFAULT": syntax error
PostgreSQL 和 SQL Server 支持完整语义,MySQL 8.0+ 也支持,但老版本不行。
最常被卡住的地方是:看到表结构里写了 DEFAULT,就以为 INSERT 时不提这个字段就自动生效——其实不然。是否触发默认值,完全取决于你有没有在语句中**明确使用 DEFAULT 关键字**,或者**彻底省略该字段且满足引擎的隐式规则**(而这规则各库不一致)。别依赖“看起来应该行”。

















