【问题标题】:Liquibase dropDefaultValue on PostgreSQL maps to "SET DEFAULT" not "DROP DEFAULT"PostgreSQL 上的 Liquibase dropDefaultValue 映射到“SET DEFAULT”而不是“DROP DEFAULT”
【发布时间】:2019-11-28 10:10:37
【问题描述】:

我正在针对 PostgreSQL 9.6 数据库运行 liquibase,并将 dropDefaultValue 更改为 NON-NULLABLE 列。

- dropDefaultValue:
    columnDataType: VARCHAR(255)
    columnName: bar
    tableName: foo

我预计这会产生 DROP DEFAULT 指令(如文档中所建议 - https://www.liquibase.org/documentation/changes/drop_default_value.html),但我看到了:

ALTER TABLE public.foo ALTER COLUMN  bar SET DEFAULT NULL

净效果是该列仍然具有默认值(NULL),而不是根本没有默认值。这是意料之中的吗?

【问题讨论】:

  • 对于可为空的列,除非另有说明,否则默认为空。所以将默认值设置为 null unsets 它。这是正确的行为
  • 谢谢@HaleemurAli - 我应该提到该列被定义为不可为空。
  • 没有“根本没有默认值”之类的东西(在任何数据库中,包括 Postgres 中) - 如果您不指定默认值,则默认值为 null
  • OK - 所以如果 pgadmin 向我显示两个不可为空的 varchar 列定义,其中一个报告 Default 根本没有值,另一个(在此 liquibase 更改之后)报告 Default 为 NULL::character varying ,那没关系,实际上是“同一件事”?

标签: postgresql liquibase


【解决方案1】:

我的实验表明,如果我运行,pg_attrdef 行会消失

ALTER TABLE ... ALTER ... SET DEFAULT NULL;

但也许有办法输入 NULL 行。

不管怎样,这很好,而且 Liquibase 没有做错任何事。 NULL 是“默认的DEFAULT 值”。

一列可以定义为NOT NULL,并且仍然有一个NULL默认值——唯一的结果是你永远不能使用该列的默认值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 2022-01-10
    相关资源
    最近更新 更多