栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

向现有表添加不可为空的列失败。是否会忽略“ 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
子句不更改列的内容,并且旧类型可以强制转换为新类型的二进制或新类型的不受约束的域,则无需重写表;否则,无需重写表。但是受影响的列上的所有索引仍必须重建。对于大型表,表和/或索引的重建可能会花费大量的时间。并且暂时需要多达两倍的磁盘空间。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/660285.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号