default是定义列默认行为的约束关键词,非可执行重置操作符;重置需用alter table配合数据库特有语法,如postgresql用alter column ... set default,mysql 5.7需modify column重写全定义,sql server须先drop constraint再add constraint。

DEFAULT关键字不能用来“重置”默认值
SQL里DEFAULT不是一条命令,也不是可执行的重置操作符——它只是定义列默认行为的**约束关键词**。你想“重置”字段默认值,实际要做的是修改表结构,用ALTER TABLE ... ALTER COLUMN ... SET DEFAULT(PostgreSQL)或ALTER TABLE ... MODIFY COLUMN ... DEFAULT(MySQL 8.0+)这类语句,而不是直接写DEFAULT。
不同数据库改默认值的语法差异很大
同一句ALTER TABLE t ALTER COLUMN c SET DEFAULT 'x'在PostgreSQL能跑,在MySQL会报错ERROR 1064 (42000),在SQL Server得用ADD CONSTRAINT配合DEFAULT约束名,SQLite则只支持建表时指定、不支持运行时修改默认值。
- PostgreSQL:支持
ALTER COLUMN ... SET DEFAULT和DROP DEFAULT - MySQL 5.7:只能通过
MODIFY COLUMN或CHANGE COLUMN重写整列定义,连带指定新DEFAULT - MySQL 8.0+:新增
ALTER COLUMN ... SET DEFAULT,但DROP DEFAULT仍需用ALTER COLUMN ... DROP DEFAULT - SQL Server:必须先查出原有默认约束名(查
sys.default_constraints),再用ALTER TABLE ... DROP CONSTRAINT删掉,最后ADD CONSTRAINT ... DEFAULT ... FOR重建 - SQLite:不支持修改默认值,只能
CREATE TABLE AS导出数据 → 建新表(带新DEFAULT)→ 导入 → 删旧表
执行前务必确认是否影响现有数据
设默认值不会改变已有行的数据,只对后续INSERT且未显式提供该列值的记录生效。但有些数据库(如旧版MySQL)在修改列定义时会隐式触发表重建,导致锁表、阻塞写入,甚至因磁盘空间不足失败。
- 检查当前默认值:PostgreSQL查
pg_attrdef,MySQL查INFORMATION_SCHEMA.COLUMNS.DEFAULT - 避免在大表上直接
MODIFY COLUMN(MySQL),优先考虑pt-online-schema-change等工具 - SQL Server中,如果原约束绑定了表达式(如
GETDATE()),新约束也必须兼容数据类型,否则ADD CONSTRAINT会拒绝 - 某些ORM(如Django ORM)生成迁移时会自动加
DEFAULT,但若手动改了DB里的默认值,下次makemigrations可能误判为“有变更”,需同步更新模型字段的default=...
想清空/移除默认值?别只写DEFAULT
写DEFAULT本身不会清除默认值;必须显式用DROP DEFAULT(PostgreSQL/MySQL 8.0+)、DROP CONSTRAINT(SQL Server)或重建列(MySQL 5.7)。漏掉这步,看起来像“重置”了,其实老默认值还在生效。
最容易被忽略的是约束名管理——SQL Server和Oracle要求每个DEFAULT约束必须有唯一名称,删的时候必须精准匹配,而错误的约束名会导致Cannot drop constraint错误,且不会提示你该约束是否存在。










