default values 不是插入“空行”,而是用各字段定义的 default 值(含 null)填充整行;仅当所有 not null 列均有 default、允许 null 或为自增主键时才能成功执行,mysql 不支持该语法,需用 insert into t() values()。

DEFAULT VALUES 是什么,它真能插“空行”?
DEFAULT VALUES 不是插入“空行”,而是让数据库用每个字段定义的 DEFAULT 值(包括 NULL)来填充整行。如果你没给任何列显式设默认值,那多数字段会变成 NULL —— 看起来像“空”,但本质是按规则填充。它不跳过约束,也不绕过 NOT NULL 列(除非该列有 DEFAULT 或允许 NULL)。
哪些情况能成功执行 INSERT ... DEFAULT VALUES?
只有当表中所有 NOT NULL 列都满足以下任一条件时,语句才能通过:
- 该列定义了
DEFAULT值(例如status VARCHAR(10) DEFAULT 'pending') - 该列允许
NULL(即没有NOT NULL约束) - 该列是自增主键(如
id SERIAL或id INT IDENTITY),数据库会自动生成值
否则会报错,典型错误是:ERROR: null value in column "xxx" violates not-null constraint。
PostgreSQL、SQL Server 和 SQLite 的行为差异
三者都支持 INSERT INTO table DEFAULT VALUES,但细节不同:
- PostgreSQL:完全支持;若含自增列(
SERIAL),自动填序列值;DEFAULT表达式(如CURRENT_TIMESTAMP)也会实时求值 - SQL Server:支持,但要求至少有一个列有默认值或可为
NULL;自增列(IDENTITY)会被自动填充 - SQLite:支持,但对
DEFAULT表达式支持有限(例如不支持CURRENT_TIME作为列默认值,除非用触发器模拟)
MySQL 是个例外 —— 它**不支持** DEFAULT VALUES 语法,必须写成 INSERT INTO table () VALUES ()(空列名 + 空值列表),且仅当所有列都有默认值或允许 NULL 时才有效。
别把 DEFAULT VALUES 当作“快速造测试数据”的捷径
它只适合结构明确、默认值完备的场景。常见误用:
- 想绕过必填字段 → 实际会失败,不如先
DESCRIBE table或查information_schema.columns确认哪些列真正可省略 - 在迁移脚本里硬写
DEFAULT VALUES却没检查目标库版本 → SQLite 3.3.0+ 才支持,旧版直接报错 - 依赖
DEFAULT CURRENT_TIMESTAMP插入时间,却没注意 PostgreSQL 中该默认值在语句开始时计算,不是每行单独算
最稳妥的做法:先看表结构,再决定是用 DEFAULT VALUES、显式列出带默认值的列,还是改用 INSERT ... SELECT 构造批量空行。










