默认值由数据库引擎原生支持,建表或改表时用DEFAULT关键字声明,插入新行且未提供该字段值时自动填充;数值用DEFAULT 0、字符串用DEFAULT 'pending'、日期用DEFAULT CURRENT_TIMESTAMP,显式插入NULL或字段名不省略则不触发默认值。

直接在建表或改表时用 DEFAULT 关键字声明值,数据库会在插入新行且未提供该字段值时自动填入——不是靠应用层判断,而是由数据库引擎原生支持。
建表时直接定义默认值
这是最常用、最清晰的方式。语法简单,语义明确:
- 数值型:写具体数字,如
score INT DEFAULT 0 - 字符串型:用单引号包裹,如
status VARCHAR(20) DEFAULT 'pending' - 日期时间型:推荐用函数(MySQL/PostgreSQL 支持),如
created_at DATETIME DEFAULT CURRENT_TIMESTAMP - 布尔型:MySQL 可用
TINYINT DEFAULT 1,PostgreSQL 可用BOOLEAN DEFAULT true
示例:
CREATE TABLE orders (id INT PRIMARY KEY AUTO_INCREMENT,
product_name VARCHAR(100) NOT NULL,
quantity INT DEFAULT 1,
order_status VARCHAR(15) DEFAULT 'new',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
已有表中添加或修改默认值
对已上线的表,可用 ALTER TABLE 补充或更新默认逻辑:
- MySQL:
ALTER TABLE orders ALTER COLUMN quantity SET DEFAULT 5; - PostgreSQL:
ALTER TABLE orders ALTER COLUMN quantity SET DEFAULT 5; - SQL Server:
ALTER TABLE orders ADD CONSTRAINT DF_orders_quantity DEFAULT 5 FOR quantity; - SQLite:
ALTER TABLE orders ADD COLUMN remark TEXT DEFAULT 'no remark';(仅支持加列时设默认)
注意:修改默认值只影响后续插入,不会改动历史数据。
插入时如何触发默认值
默认值生效的前提是“不提供该字段”——不是留空,也不是写 NULL:
- ✅ 正确(触发默认):
INSERT INTO orders (product_name) VALUES ('Laptop'); - ❌ 错误(存 NULL 或报错):
INSERT INTO orders (product_name, quantity) VALUES ('Laptop', NULL);(若列不允许 NULL 就失败) - ⚠️ 特殊情况:
INSERT INTO orders (...) VALUES (... , DEFAULT);显式写DEFAULT也能强制走默认逻辑,但仅限VALUES场景,INSERT ... SELECT不支持
几个容易踩的坑
DEFAULT 看似简单,但跨数据库行为差异大:
- SQLite 不支持函数型默认值,
DEFAULT datetime('now')是非法的,只能写死如DEFAULT '2024-01-01' - MySQL 中
ON DUPLICATE KEY UPDATE col = DEFAULT会报错,必须写成col = DEFAULT(col) - 字段定义为
NOT NULL却没设DEFAULT,插入时不填该字段就会报错(除非是自增主键) -
DEFAULT和是否允许NULL是两回事:可同时有DEFAULT 'N/A'和NULL,也可DEFAULT NULL且允许为空










