直接用DEFAULT关键字可显式触发默认值,如INSERT INTO t (a,b) VALUES (1,DEFAULT);省略字段名仅在该列有DEFAULT定义时生效;DEFAULT VALUES适用于全列均有默认值的表。

直接用 DEFAULT 关键字就能触发列的默认值插入,不需要写具体值,也不需要留空或传 NULL —— 除非该列允许 NULL 且你真想存空值。
INSERT 语句中显式写 DEFAULT
这是最明确、最可控的方式,尤其适合只想对部分字段设默认值的场景。
- 语法是:
INSERT INTO table_name (col1, col2) VALUES (val1, DEFAULT); - 必须把目标列名写进括号里,否则数据库不知道你要给哪一列用默认值
- 如果某列定义了
DEFAULT CURRENT_TIMESTAMP,写DEFAULT就会自动填入当前时间,不是字符串'DEFAULT' - 注意:MySQL 8.0+ 和 PostgreSQL 都支持;SQLite 支持但不支持函数类默认值(如
CURRENT_TIME)在DEFAULT中生效
省略字段名让默认值自动生效
只在 INSERT 列表中不提某列,且该列有默认值定义时,数据库才会自动填充。
- 例如:
INSERT INTO users (name, email) VALUES ('Alice', 'a@example.com');—— 如果created_at列有DEFAULT CURRENT_TIMESTAMP,它会被自动赋值 - 但如果该列定义为
NOT NULL且没设默认值,省略它就会报错:Column 'xxx' cannot be null - PostgreSQL 要求所有非空且无默认值的列都必须显式提供值;MySQL 在严格模式下同理
- 别依赖“字段顺序”来省略——显式写出列名才是安全做法
DEFAULT VALUES 全部走默认值
当整行都用默认值时,DEFAULT VALUES 是最简洁写法,但使用场景有限。
- 语法:
INSERT INTO users DEFAULT VALUES; - 适用于建表时所有列都有默认值(或允许
NULL),否则会报错 - MySQL 和 PostgreSQL 都支持;SQLite 支持但对自增主键行为不一致(可能生成 0 或跳过)
- 不能混用:不能写成
INSERT INTO t (a) VALUES (1), DEFAULT VALUES;—— 这是语法错误
常见陷阱:NULL 不等于 DEFAULT
很多人误以为不传值或传 NULL 就会触发默认值,其实完全相反。
- 显式写
NULL:如果列定义为NOT NULL,直接报错;如果允许NULL,就真存NULL,不会 fallback 到默认值 - 不写字段但列没默认值:报错,不是静默填
NULL - 用 ORM(如 Django、SQLAlchemy)时,注意其“空值处理策略”——有些框架默认发
NULL而非省略字段,结果绕过了默认值 - 检查默认值是否生效?查
SHOW CREATE TABLE table_name;(MySQL)或\d table_name(PostgreSQL)确认定义
真正容易被忽略的是:默认值逻辑只在 SQL 层触发,应用层传来的 NULL 或空字符串不会被数据库“转换”成默认值;得靠明确写 DEFAULT 或彻底省略字段才能激活。

















