Liquibase操作PostgreSQL非空列dropDefaultValue时映射为SET DEFAULT而非DROP DEFAULT
这确实属于预期行为,原因如下:
1. PostgreSQL中默认值的底层逻辑
在PostgreSQL里,移除列的默认值和将默认值设为NULL对于非空列来说,实际效果完全等价:
- 当执行
ALTER TABLE foo ALTER COLUMN bar DROP DEFAULT;,该列会恢复到“无显式默认值”的状态 - 当执行
ALTER TABLE foo ALTER COLUMN bar SET DEFAULT NULL;,该列的默认值被设为NULL
但因为你的列带有NON-NULLABLE约束,这两种操作之后,插入数据时如果不指定bar列的值,都会触发非空约束报错——NULL不满足非空要求,所以本质上都达到了“必须显式提供列值”的效果,和你期望的“完全移除默认值”的目标一致。
2. Liquibase对PostgreSQL的适配逻辑
Liquibase的dropDefaultValue变更在PostgreSQL数据库环境下,就是通过生成ALTER COLUMN ... SET DEFAULT NULL来实现“移除默认值”的效果。这是Liquibase针对PostgreSQL的特定适配,属于官方预期的行为,并非bug。
简单来说:虽然生成的SQL语句和你预期的DROP DEFAULT不一样,但最终实现的效果和你想要的完全相同——该列不再有可使用的默认值,插入时必须显式指定bar的值。
内容的提问来源于stack exchange,提问作者wabrit
相关产品推荐
相关产品推荐

