default约束用于在插入记录时自动填充未指定值的字段,适合创建时间、状态、数值型字段等固定取值场景。例如created_at设为当前时间、status默认“active”、库存默认0。建表时可在字段后加default值,如status varchar(20) default ‘active’,不同数据库函数支持不同,如mysql用current_timestamp,postgresql用now()。已有表可用alter table修改默认值,mysql和postgresql语法均为alter table … alter column … set default,但需注意细节差异。default可与not NULL共用,确保字段非空且自动填充,如int not null default 1,防止误传null。合理使用default能提升效率和数据完整性,但应避免滥用,如文本字段设长默认值可能增加维护难度。
在 SQL 中,DEFAULT 约束的作用是为表中的某个字段设置默认值。当插入新记录时,如果没有为该字段指定值,系统就会自动使用这个默认值填充。这种方式可以有效避免字段为空的问题,也减少了手动输入的负担。
什么时候适合用 DEFAULT 设置默认值?
DEFAULT 约束适用于那些在大多数情况下有固定取值的字段。比如:
- 创建时间字段(如 created_at)通常设为当前时间
- 用户状态字段(如 status)默认设为“启用”或“正常”
- 数值型字段(如库存数量)默认为 0
这类场景下,如果每次都手动插入相同的值,效率低还容易出错。使用 DEFAULT 可以让数据库自动处理这些重复操作。
怎么在建表时设置 DEFAULT 默认值?
在创建表的时候,可以直接在字段定义后加上 DEFAULT 值 来设置默认值。语法如下:
CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(100), status VARCHAR(20) DEFAULT 'active', created_at DATETIME DEFAULT CURRENT_TIMESTAMP );
上面的例子中:
- status 字段没有传值时,默认填入 ‘active’
- created_at 使用了系统函数 CURRENT_TIMESTAMP,表示插入时间戳
注意:不同数据库对函数支持略有差异,比如 MySQL 支持 CURRENT_TIMESTAMP,而 PostgreSQL 用的是 NOW(),具体要查文档。
已有表怎么修改 DEFAULT 默认值?
如果你已经创建好了表,也可以通过 ALTER TABLE 修改字段的默认值。语法大致如下(以 MySQL 为例):
ALTER TABLE users ALTER COLUMN status SET DEFAULT 'inactive';
如果是 PostgreSQL,则写法稍有不同:
ALTER TABLE users ALTER COLUMN status SET DEFAULT 'inactive';
虽然语法看起来差不多,但注意关键字和分号等细节。不同的数据库系统可能会有不同的语法规则,建议操作前先备份数据。
DEFAULT 和 NOT NULL 能一起用吗?
当然可以。很多情况下我们既希望字段不能为空,又不想每次都要手动填值,这时候就可以把 DEFAULT 和 NOT NULL 一起用上:
CREATE TABLE orders ( order_id INT PRIMARY KEY, quantity INT NOT NULL DEFAULT 1 );
这样设置之后:
- 如果插入时不传 quantity,就默认为 1
- 如果强制传了个 NULL,数据库会报错,因为 NOT NULL 不允许为空
这种组合特别适合用于防止误操作导致的数据异常。
基本上就这些。DEFAULT 约束是个实用的小功能,合理使用能提升开发效率和数据完整性。不过也要注意别滥用,比如给文本字段设置过长的默认值,或者在不合适的字段上加默认值,反而可能带来维护麻烦。