【问题标题】:Why default is not used when I set not null contratint?为什么我设置非空约束时不使用默认值?
【发布时间】:2019-03-28 16:47:41
【问题描述】:

我在 postgresql 数据库中有表。

对于给定的列,我设置了默认值,然后我希望它是NOT NULL

ALTER TABLE "order" ALTER COLUMN last_bill_date SET DEFAULT '-Infinity';
ALTER TABLE "order" ALTER COLUMN last_bill_date SET NOT NULL;

但第二个语句失败:

ERROR:  column "last_bill_date" contains null values

为什么NOT NULL应用于此列时不使用DEFAULT值?

【问题讨论】:

    标签: postgresql alter-table notnull


    【解决方案1】:

    the documentation:

    默认default_expr

    (...)

    默认表达式将用于未指定列值的任何插入操作。如果列没有默认值,则默认值为空。

    修改后的默认表达式不能修改表中已经存在的行,你应该在设置非空约束之前这样做:

    update "order"
    set last_bill_date = '-Infinity'
    where last_bill_date is null
    

    【讨论】:

    • 你不应该称之为约束。
    • @LaurenzAlbe - 意见分歧SQL DEFAULT Constraint
    • 我看到并且很惊讶。如果它不限制任何东西,我会拒绝称它为约束。
    • 我同意严格的语义表明您的观点。我想这个词很受欢迎,因为它简洁易用。
    • @klin:我读到 postgresql(可能是 11?)可以对更改的列进行延迟更新。而那个懒惰的人使用default 值。
    猜你喜欢
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 2020-01-28
    • 2021-10-12
    • 2021-05-13
    • 1970-01-01
    相关资源
    最近更新 更多