当前位置: 首页 > news >正文

【PostgreSQL】表操作-修改表

【PostgreSQL】表操作快速链接
创建表及基础表命令
修改表
表权限

添加列

ALTER TABLE products ADD COLUMN description text;

新列最初填充给定的任何默认值DEFAULT(如果未指定子句,则为 null)。

注意:
从 PostgreSQL 11 开始,添加ALTER TABLE具有常量默认值的列不再意味着在执行语句时需要更新表的每一行。相反,默认值将在下次访问该行时返回,并在重写表时应用,即使在大型表上也非常快。

但是,如果默认值是可变的(例如clock_timestamp()),ALTER TABLE则需要使用执行时计算的值更新每一行。为了避免可能冗长的更新操作,特别是如果您打算用大部分非默认值填充该列,最好添加没有默认值的列,使用UPDATE插入正确的值,然后添加任何所需的默认值,如下所述。

您还可以使用常用语法同时定义对列的约束:

ALTER TABLE products ADD COLUMN description text CHECK (description <> '');

事实上,所有可以应用于列描述的选项都可以在这里使用。但请记住,默认值必须满足给定的约束,否则将失败。CREATE TABLE或者ADD,您可以在正确填写新列后稍后添加约束(见下文)。

删除列

若要删除列,请使用如下命令:

ALTER TABLE products DROP COLUMN description;

列中的任何数据都会消失。涉及该列的表约束也会被删除。但是,如果该列被另一个表的外键约束引用,则 PostgreSQL 不会以静默方式删除该约束。您可以通过添加CASCADE来授权删除依赖于该列的所有内容:

ALTER TABLE products DROP COLUMN description CASCADE;

添加约束

若要添加约束,请使用表约束语法。例如:

ALTER TABLE products ADD CHECK (name <> '');
ALTER TABLE products ADD CONSTRAINT some_name UNIQUE (product_no);
ALTER TABLE products ADD FOREIGN KEY (product_group_id) REFERENCES product_groups;

若要添加不能写为表约束的非 null 约束,请使用以下语法:

ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;

将立即检查约束条件,因此表数据必须满足约束条件才能添加。

删除约束

要删除约束,您需要知道其名称。如果你给它起个名字,那就很容易了。否则,系统会分配一个生成的名称,您需要找出该名称。psql 命令在这里可能会有所帮助;其他接口也可能提供检查表详细信息的方法。那么命令是:

\d tablename
ALTER TABLE products DROP CONSTRAINT some_name;

如果您正在处理生成的约束名称,例如$2 ,请不要忘记需要用双引号将其用作有效的标识符。

与删除列一样,如果要删除其他内容所依赖的约束,则需要添加。例如CASCADE,外键约束依赖于引用列的唯一键或主键约束。

这适用于除非 null 约束之外的所有约束类型。若要删除 not null 约束,请使用:

ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;

回想一下,非 null 约束没有名称。

更改列的默认值

若要为列设置新的默认值,请使用如下命令:

ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;

请注意,这不会影响表中的任何现有行,它只是更改了未来命令INSERT的默认值。

若要删除任何默认值,请使用:

ALTER TABLE products ALTER COLUMN price DROP DEFAULT;

这实际上与将默认值设置为 null 相同。因此,在未定义默认值的地方删除默认值不会出错,因为默认值隐式为 null 值。

更改列的数据类型

若要将列转换为其他数据类型,请使用如下命令:

ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);

仅当列中的每个现有条目都可以通过隐式强制转换转换为新类型时,此操作才会成功。如果需要更复杂的转换,可以添加一个子句USING,指定如何从旧值计算新值。

PostgreSQL 将尝试将列的默认值(如果有)转换为新类型,以及涉及该列的任何约束。但这些转换可能会失败,或者可能会产生令人惊讶的结果。通常最好在更改列类型之前删除列上的任何约束,然后再添加回经过适当修改的约束。

重命名列

要重命名列:

ALTER TABLE products RENAME COLUMN product_no TO product_number;

重命名表

要重命名表:

ALTER TABLE products RENAME TO items;
http://www.lryc.cn/news/271684.html

相关文章:

  • 【Java系列】文件操作详解
  • docker-compose 安装 RocketMq
  • 【心得】PHP反序列化高级利用(phar|session)个人笔记
  • MyBatisPlus之增删改查
  • pytorch03:transforms常见数据增强操作
  • blob文件流前端显示pdf
  • Android 接入第三方数数科技平台
  • LVM和磁盘配额
  • uni-app uni-app内置组件
  • C语言——格式说明符前面加修饰符
  • 实验室(检验科)信息系统LIS源码,客户端:WPF+Windows Forms
  • 有道翻译web端 爬虫, js
  • uni-app API接口扩展组件(uni-ui)
  • 信息化和数字化的本质区别是什么?
  • 发表《Nature》!美国研究团队发布可编程逻辑量子处理器
  • CISSP 第1章:实现安全治理的原则和策略
  • 【并发设计模式】聊聊线程本地存储模式如何实现的线程安全
  • 边缘计算网关:重新定义物联网数据处理
  • Linux之下载安装
  • 【HarmonyOS开发】案例-记账本开发
  • webrtc中的接口代理框架
  • 【AIGC-图片生成视频系列-4】DreamTuner:单张图像足以进行主题驱动生成
  • Jupyter Notebook的10个常用扩展介绍
  • uniapp项目如何引用安卓原生aar插件(避坑指南三)
  • YOLOv8改进 | 检测头篇 | ASFF改进YOLOv8检测头(全网首发)
  • 思维训练-怎样设计一个MQ
  • RK3399平台入门到精通系列讲解(导读篇)21天挑战Linux系统开发
  • 企业微信会话存档sdk报错:A fatal error has been detected by the Java Runtime Environment
  • nginx-docker 搭建websocket反向代理
  • blender插件开发