首页 > 数据库 >PostgreSQL 管理数据表(二)

PostgreSQL 管理数据表(二)

时间:2023-07-05 10:25:18浏览次数:52  
标签:product PostgreSQL name 管理 数据表 products test TABLE ALTER

修改表

当我们创建好一个表之后,可能会由于业务变更或者其他原因需要修改它的结构。PostgreSQL使ALTER TABLE语句修改表的定义:

ALTER TABLE name action;

其中的action表示要执行的操作。常见的修改操作包括:

  • 添加字段
  • 删除字段
  • 添加约束
  • 删除约束
  • 修改字段默认值
  • 修改字段数据类型
  • 重命名字段
  • 重命名表

添加字段

为表添加一个字段的命令如下:

ALTER TABLE table_nameADD COLUMN column_name data_type column_constraint;

添加字段与创建表时的字段选项相同,包含字段名称、字段类型以及可选的约束。假设我们已经创建了一个产品表products:

CREATE TABLE products
(
    product_no integer PRIMARY KEY,
    name       text,
    price      numeric
);

通过以下语句为产品表增加一个新的字段product_desc

alter table products add column product_desc text;

对于表中已有的数据,新增加的列将会使用默认值进行填充;如果没有指定DEFAULT值,使用空值填充。添加字段时还可以定义约束。不过需要注意的是,如果表中已经存在数据,新增字段的默认值有可能会违反指定的约束。例如:

test=# INSERT INTO products (product_no, name, price) VALUES (1001, '4G校园套餐(折扣版)', 18.2);
INSERT 0 1                    ^
test=# select * from products;
 product_no |         name         | price 
------------+----------------------+-------
       1001 | 4G校园套餐(折扣版) |  18.2
test=# alter table products add column product_desc text not null;
ERROR:  column "product_desc" contains null values

以上语句出错的原因在于新增的字段notes存在非空约束,但是对于已有的数据该字段的值为空。解决的方法有两个:添加约束的同时指定一个默认值;添加字段时不指定约束,将所有数据的字段值手动填充(UPDATE)之后,再添加约束。以下语句为新增的字段指定了一个默认值:

test=# aLTER TABLE products ADD COLUMN notes text DEFAULT'new product' not null;
ALTER TABLE
test=# select * from products;
 product_no |         name         | price |    notes    
------------+----------------------+-------+-------------
       1001 | 4G校园套餐(折扣版) |  18.2 | new product

删除字段

删除一个字段的语句如下:

ALTER TABLE table_name DROP COLUMN column_name;

将产品表中的notes字段删除:

test=# \d products;
                        Table "hr.products"
   Column   |  Type   | Collation | Nullable |       Default       
------------+---------+-----------+----------+---------------------
 product_no | integer |           | not null | 
 name       | text    |           |          | 
 price      | numeric |           |          | 
 notes      | text    |           | not null | 'new product'::text
Indexes:
    "products_pkey" PRIMARY KEY, btree (product_no)

test=# alter table products  drop  column notes;
ALTER TABLE
test=# \d products;
                  Table "hr.products"
   Column   |  Type   | Collation | Nullable | Default 
------------+---------+-----------+----------+---------
 product_no | integer |           | not null | 
 name       | text    |           |          | 
 price      | numeric |           |          | 
Indexes:
    "products_pkey" PRIMARY KEY, btree (product_no)

test=# 

删除字段后,相应的数据也会自动删除。同时,该字段上的索引或约束(products_description_check)也会同时被删除。但是,如果该字段被其他对象(例如外键引用、视图、存储过程等)引用,无法直接删除。

test=# ALTER TABLE departments DROP COLUMN department_id;
ERROR:  cannot drop column department_id of table departments because other objects depend on it
DETAIL:  constraint emp_dept_fk on table employees depends on column department_id of table departments
HINT:  Use DROP ... CASCADE to drop the dependent objects too.

由于departments表的department_id是employees表的外键引用列,无法直接删除该字段。通过提示可以看出,在DROP的最后加上CASCADE选项即可级联删除依赖的对象。

ALTER TABLE departments DROP COLUMN department_id CASCADE;

字段department_id被删除,同时employees表中的外键也被级联删除。

添加约束

添加约束时通常使用表级约束语法:

ALTER TABLE table_name ADD table_constraint;

其中,table_constraint可以参考前文。以下是为产品表products增加约束的一些示例: 

test=# ALTER TABLE products ADD CONSTRAINT products_price_min CHECK (price > 0);
ALTER TABLE
test=# ALTER TABLE products ADD CONSTRAINT products_name_uk UNIQUE (name);
ALTER TABLE

对于非空约束(NOT NULL),可以使用以下语法:

ALTER TABLE table_name ALTER COLUMN column_name SET NOT NULL;

将产品表的name字段设置为非空:

test=# \d products;
                  Table "hr.products"
   Column   |  Type   | Collation | Nullable | Default 
------------+---------+-----------+----------+---------
 product_no | integer |           | not null | 
 name       | text    |           |          | 
 price      | numeric |           |          | 
Indexes:
    "products_pkey" PRIMARY KEY, btree (product_no)
    "products_name_uk" UNIQUE CONSTRAINT, btree (name)
Check constraints:
    "products_price_min" CHECK (price > 0::numeric)

test=# ALTER TABLE products ALTER COLUMN name SET NOT NULL;
ALTER TABLE
test=# \d products;
                  Table "hr.products"
   Column   |  Type   | Collation | Nullable | Default 
------------+---------+-----------+----------+---------
 product_no | integer |           | not null | 
 name       | text    |           | not null | 
 price      | numeric |           |          | 
Indexes:
    "products_pkey" PRIMARY KEY, btree (product_no)
    "products_name_uk" UNIQUE CONSTRAINT, btree (name)
Check constraints:
    "products_price_min" CHECK (price > 0::numeric)

添加约束时,系统会检验已有数据是否满足条件,如果不满足将会添加失败。

标签:product,PostgreSQL,name,管理,数据表,products,test,TABLE,ALTER
From: https://www.cnblogs.com/wdh01/p/17231392.html

相关文章

  • PostgreSQL 管理数据表(一)
    创建表在PostgreSQL中,使用CREATETABLE语句创建一个新表:CREATETABLEtable_name(column_namedata_typecolumn_constraint,column_namedata_type,...,table_constraint);建表语句说明首先,table_name指定了新表的名称。括号内是字段的定义,column......
  • PostgreSQL 管理数据表(三)
    删除约束删除约束通常需要知道它的名称,可以通过psql工具的\dtable_name命令查看表的约束。ALTERTABLEtable_nameDROPCONSTRAINTconstraint_name[RESTRICT|CASCADE];RESTRICT是默认值,如果存在其他依赖于该约束的对象,需要使用CASCADE执行级联删除。例如,外键约束依赖......
  • DevExpress WPF Scheduler组件,快速构建性能优异的调度管理器!(下)
    在上文中(点击这里回顾>>),我们介绍了DevExpressWPFScheduler组件中的日历视图、时间轴视图等,在本文中我们将继续带大家了解Scheduler组件的UI/UX自定义等其他功能。DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能......
  • 浅析EasyCVR视频技术与AR实景智能管理平台在智慧厂区中的应用
    一、背景分析新型智慧厂区是运用人工智能、大数据、物联网和设备监控技术加强厂区安保和信息管理。通过先进技术,保障厂区生产运营安全,同时减少生产线上的人工干预、及时正确地采集各类生产数据,以及合理的生产计划编排与生产进度,并且整合各业务系统数据资源,构建一个高效智能、绿色......
  • python-contextlib上下文管理器
    pythoncontextlib上下文管理器python-contextlib上下文管理器两大作用:--可以以一种更加优雅的方式,操作(创建/获取/释放)资源,如文件操作、数据库连接;--可以以一种更加优雅的方式,处理异常;读取文件的一般流程#打开文件f=open('file.txt')try:forlineinf:......
  • postgresql大表分批次删除
    [root@localhost~]#cat/root/delete_big_table.sh#!/bin/bash#$1对应表名,$2对应主键列,$3对应一次删除多少行i=`psql-h127.0.0.1-Upostgres-dtenant_1011046-c"selectceil(count(1)/${3}::float)from${1}whereplatcreatetime<'2023-04-3023:59:59'......
  • 从零到壹-API研发管理心得分享
    ❤️作者主页:小虚竹PC端左侧加我微信,进社群,有送书等更多活动!文章目录零、前言一、API研发管理1.1、什么是API研发管理1.2、痛点1.3、解决方案二、搭建部署及不同角色的关注点介绍2.1、下载安装2.2、开发管理创建项目及从第三方导入apiapi变更通知2.3、测试管理编写测试用例批量测试......
  • [引]CCAA ITSMS 信息技术服务管理体系基础考试大纲
    CCAA-TR-111-01信息技术服务管理体系基础考试大纲_中国认证认可协会 http://www.ccaa.org.cn/ksdg/644.html申请注册信息技术服务管理体系审核员实习级别的人员,需通过“信息技术服务管理体系基础”科目考试。2.2考试方式“信息技术服务管理体系基础”科目考试为闭卷考试,考......
  • 用户管理页面布局
    1.观察前端项目写一个用户管理页面,做查询系统,新增2.查询部分2.1.打开Element官网,查看相关的组件2.2.在user.vue文件中删除“用户管理”,放一个卡片样式进去2.3.两端间距,改大一些,修改section.app-main2.4.搜索栏缩短,加上搜索图标和新增图标2.5.将新增按钮放......
  • 关于mysql存储引擎、管理和维护概述
    数据库的存储引擎是数据库的底层软件组件,数据库管理系统使用数据库引擎进行增删查改的操作。mysql的核心就是数据库引擎。mysql5.7支持的存储引擎有innoDBMyISAMMemory可以通过showengines。InnoDB存储引擎:1.InnoDB给mysql提供了具有提交,回滚,崩溃恢复的功能的事务能力的安......