【问题标题】:NOT NULL constraint asking for a default valueNOT NULL 约束要求默认值
【发布时间】:2016-04-19 23:19:44
【问题描述】:

使用 NOT NULL 约束向我的数据库添加一个新列,但 Redshift 提醒我应该定义一个默认值。我认为 NOT NULL 的意义在于强制定义?

ALTER TABLE users add column
  name varchar(255) NOT NULL
;

结果:

[Amazon](500310) Invalid operation: ALTER TABLE ADD COLUMN defined as NOT NULL must have a non-null default expression;

有没有办法强制列不能为空?

【问题讨论】:

  • 数据库中的现有行对于新列应该有什么值?它们不能为空,因此您必须为新行添加默认值。

标签: postgresql amazon-redshift


【解决方案1】:

NOT NULL 是确保列包含值的正确方法。 但是,由于您的表已经存在,因此其中已经存在的行将没有新的 name 列的值,因此它们将违反 NOT NULL 约束。

通过指定默认值,您可以确保为任何现有行分配该值,从而符合您的NOT NULL 约束。

【讨论】:

  • 在修补时我发现我可以创建一个对行有 NOT NULL 约束的新表。您的回答是有道理的,如果表已经存在,您不能追溯添加 NOT NULL 约束,因为可能存在 NULL 值。当他们要求默认值时,这是对您表的元约束。
  • 没错。当您创建表时,您可以添加(或省略)您喜欢的任何约束,因为没有要约束的数据。
【解决方案2】:

如果列是NOT NULL,它必须有一个值,对吧?

为什么不加:DEFAULT default_expr

【讨论】:

  • 并不总是需要默认值。
  • 那么,您将如何遵守 NOT NULL 约束?完全没有必要投反对票。
  • 我要做的是添加没有 NOT NULL 约束的列,用适当的值填充列,然后更改列以​​添加 NOT NULL 约束(假设列应该是 NOT NULL)。
  • 见上面三十二上校的回答。
猜你喜欢
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 2018-08-24
  • 2022-01-19
  • 2021-11-16
  • 2020-12-18
  • 2021-03-20
相关资源
最近更新 更多