向现有表添加不可为空的列失败。是否会忽略“ alue”属性?

向现有表添加不可为空的列失败。是否会忽略“ alue”属性?,第1张

向现有表添加不可为空的列失败。是否会忽略“ alue”属性? 简短答案

如果在创建列时添加了非null约束,则“
value”属性将不起作用(文档中未提及)。生成的SQL将无法执行。

解决方法

问题中描述的解决方法是解决方法。产生的SQL将是:

  1. 添加列

    ALTER TABLE layer ADD COLUMN abstract_trimmed varchar(455);
  2. 每行将其设置为非空值

    UPDATE table SET abstract_trimmed = 'No text';
  3. 添加NOT NULL约束

    ALTER TABLE layer ALTER COLUMN abstract_trimmed SET NOT NULL;
为什么?

列默认值仅通过插入到列中

INSERT
。“值”标签将为您完成此 *** 作,但是 添加列 之后
。Liquibase尝试一步一步添加列,并设置
NOT NULL
约束:

ALTER TABLE layer ADD abstract_trimmed VARCHAr(455) NOT NULL;

…当表已经包含行时,这是 不可能 的。只是不够聪明。

替代解决方案

从PostgreSQL 8.0开始(到现在为止几乎永远如此),一种替代方法是添加 一个带有非null

DEFAULT
的新列:

ALTER TABLE layerADD COLUMN abstract_trimmed varchar(455) NOT NULL DEFAULT 'No text';

手册:

当添加了列

ADDCOLUMN
DEFAULT
指定了非易失性时,将在声明时评估默认值,并将结果存储在表的元数据中。该值将用于所有现有行的列。如果未
DEFAULT
指定,则使用NULL。在任何情况下都不需要重写该表。

添加具有volatile的列

DEFAULT
或更改现有列的类型将需要重写整个表及其索引。例外情况是,在更改现有列的类型时,如果该
USING
子句不更改列的内容,并且旧类型可以强制转换为新类型的二进制或新类型的不受约束的域,则无需重写表;否则,无需重写表。但是受影响的列上的所有索引仍必须重建。对于大型表,表和/或索引的重建可能会花费大量的时间。并且暂时需要多达两倍的磁盘空间。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5662353.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存