PostgreSQL15——管理数据表

PostgreSQL15深度解析(从15.0-15.12) PostgreSQL 15系列通过15.0到15.12的迭代,实现了性能、安全与功能的全面跃升。15.0引入革命性MERGE命令,重构逻辑复制架构,深化JSON生态;算法级优化使排序效率指数级提升,压缩技术栈重构平衡存储与I/O;并行计算引擎突破传统限制,资源隔离提升多核利用率。运维体系强化零信任安全模型,可观测性工具链精准定位瓶颈,统计信息内存化架构保障实时性。后续小版本持续修复漏洞,如15.3修复MERGE内存泄漏,15.5补安全补丁,15.7优化索引。 阅读详情

一、创建表

-- 语法
CREATE TABLE table_name(
	column_name data_type column_constraint,
	column_name data_type,
	...,
	table_constraint
);
-- 示例
create table departments(
	department_id integer not null primary key,
	department_name varchar(30) not null
);

PostgreSQL 支持 SQL 标准中的所有字段约束和表约束。其中,字段约束包括:

  • NOT NULL:非空约束,该字段的值不能为空(NULL)。
  • UNIQUE:唯一约束,该字段每一行的值不能重复。不过,PostgreSQL 允许该字段存在多个 NULL 值,并且将它们看作不同的值。需要注意的是 SQL 标准只允许 UNIQUE 字段中存在一个 NULL 值。
  • PRIMARY KEY:主键约束,包含了 NOT NULL 约束和UNIQUE 约束。如果主键只包含一个字段,可以通过列级约束进行定义(参考上面的示例);但是如果主键包含多个字段(复合主键)或者需要为主键指定一个自定义的名称,需要使用表级约束进行定义。
  • REFERENCES:外键约束,字段中的值必需已经在另一个表中存在。外键用于定义两个表之间的参照完整性(referential integrity),例如,员工的部门编号字段必须是一个已经存在的部门。
  • CHECK:检查约束,插入或更新数据时检查数据是否满足某个条件。例如,产品的价格必需大于零。
  • DEFAULT:默认值,插入数据时,如果没有为这种列指定值,系统将会使用默认值代替。

表级约束和字段约束类似,只不过它是基于整个表定义的约束,还能够为约束指定自定义的名称。PostgreSQL 支持的表级约束包括:

  • UNIQUE(column1, …):唯一约束,括号中的字段值或字段值的组合必须唯一。
  • PRIMARY KEY(column1, …):主键约束,定义主键或者复合主键。
  • REFERENCES:定义外键约束。
  • CHECK:定义检查约束。
-- 以下示例创建员工表
create table employees(
	employee_id integer not null,
	first_name character varying(20),
	last_name character varying(25) not null,
	email character varying(25) not null,
	phone_number character varying(20),
	hire_date date not null,
	salary numeric(8,2),
	commission_pct numeric(2,2),
	manager_id integer,
	department_id integer,
	constraint emp_emp_id_pk primary key (employee_id),
	constraint emp_salary_min check (salary > 0),
	constraint emp_email_uk unique (email),
	constraint emp_dept_fk foreign key (department_id) references departments(department_id),
	constraint emp_manager_fk foreign key (manager_id) references employees (employee_id)
);

在这里插入图片描述

除了自己定义表的结构之外,PostgreSQL 还提供了另一个创建表的方法,就是通过一个查询的结果创建新表:

create table table_name
as query;

-- 或者

select ...
into new_table
from ...;

例如,我们可以基于 employees 复制出两个新的表:

create table emp1
as 
select *
from employees;

-- 或
select * 
into emp2
from employees;

1.1、模式搜索路径

在PostgreSQL 中,表属于某个模式(schema)。当我们创建表时,更完整的语法应该是:

CREATE TABLE schema_name.table_name
...

访问表的时候也是一样。但是我们在前面创建示例表的时候,并没有加上模式名称的限定。这里涉及到一个模式的搜索路径概念。

我们先看一下当前的搜索路径:
在这里插入图片描述

搜索路径是一个逗号分隔的模式名称。当我们使用表的时候,PostgreSQL 会依次在这些模式中进行查找,返回第一个匹配的表名;当我们创建一个新表时,如果没有指定模式名称,
PostgreSQL 会在第一个模式中进行创建。

第一个模式默认为当前用户名,如果不存在该模式,使用后面的公共模式(public)。
在这里插入图片描述

当前用户名为postgres,但是不存在名为 postgres 的模式,因此我们创建的表会位 public 模式中。
在这里插入图片描述

我们可以通过SET 命令修改默认的搜索路径:

SET search_path TO app,public;

此时,如果我们再创建新表而不指定模式名称时,默认会在模式 app 中创建。除了表之外,其他的模式对象,例如索引、函数、类型等等,也遵循相同的原则。

二、修改表

PostgreSQL 使ALTER TABLE 语句修改表的定义:

ALTER TABLE name action;

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

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

2.1、添加字段

添加字段与创建表时的字段选项相同,包含字段名称、字段类型以及可选的约束。为表添加一个字段的命令如下:

ALTER TABLE table_name
ADD COLUMN column_name data_type column_constraint;
-- 假设我们已经创建了一个产品表 products
create table products (
	product_no integer primary key,
	name text,
	price numeric
);

-- 通过以下语句为产品表增加一个新的字段 description
alter table products add column description text;

对于表中已有的数据,新增加的列将会使用默认值进行填充;如果没有指定 DEFAULT 值,使用空值填充。

添加字段时还可以定义约束。不过需要注意的是,如果表中已经存在数据,新增字段的默认值有可能会违反指定的约束。例如:

-- 插入一行数据
insert into products(product_no, name, price)
values(1, 'Cheese', 9.99);

--新增字段notes
alter table products add column notes text not null;
-- 报错
ERROR:  column "notes" of relation "products" contains null values

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

以下语句为新增的字段指定了一个默认值:

alter table products add column notes text default 'new product' not null;

select * from products;

在这里插入图片描述

2.2、删除字段

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

ALTER TABLE table_name
DROP COLUMN column_name;

将产品表中的 notes 字段删除:
在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

2.3、添加约束

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

ALTER TABLE	table_name ADD table_constraint;

以下是为产品表 products 增加约束的一些示例:

alter table products add constraint products_price_min CHECK (price > 0);

alter table products add constraint products_name_uk UNIQUE (name);

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

alter table products alter name set not null;

2.4、删除约束

删除约束通常需要知道它的名称,可以通过 psql 工具的\d table_name 命令查看表的约束。

ALTER TABLE table_name DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ];

RESTRICT 是默认值,如果存在其他依赖于该约束的对象,需要使用 CASCADE 执行级联删除。例如,外键约束依赖于被引用字段上的唯一约束或主键约束。

删除产品表 name 字段上的唯一约束:
在这里插入图片描述

删除非空约束也需要使用单独的语法:

ALTER TABLE table_name ALTER COLUMN column_name DROP NOT NULL;

以下语句将会删除产品表 name 字段上的非空约束:
在这里插入图片描述

2.5、修改字段默认值

如果想要为某个字段设置或者修改默认值,可以使用以下语句:

ALTER TABLE table_name ALTER COLUMN column_name SET DEFAULT value;

为产品表的价格设置一个默认值:

alter table products alter column price set default 7.77;

同样,可以删除已有的默认值:

ALTER TABLE table_name ALTER COLUMN column_name DROP DEFAULT;

删除产品表中的价格默认值:

alter table products alter column price drop default;

2.6、修改字段数据类型

通常来说,可以将字段的数据类型修改为兼容的类型。

ALTER TABLE table_name ALTER COLUMN column_name TYPE new_data_type;

以下语句将产品表的 price 字段的类型修改为 numeric(10,2):

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

因为已有的数据能够隐式转换为新的数据类型,上面的语句能够执行成功。如果无法执行隐式转换(例如将字符串‘1’转换为数字 1),可以使用 USING 执行显式转换。

ALTER TABLE table_name ALTER COLUMN column_name TYPE new_data_type USING expression;

我们先为产品表增加一个字符串类型的字段level,然后将其修改为整数类型:

alter table products add column level varchar(10);

在这里插入图片描述

2.7、重命名字段

使用以下语句可以修改表中字段的名称:

ALTER TABLE table_name
RENAME COLUMN column_name TO new_column_name;

我们将产品表的字段 product_no 改名为 product_number:

alter table products
rename column product_no to product_number;

2.8、重命名表

如果需要修改表的名称,可以使用以下语句:

ALTER TABLE table_name
RENAME TO new_name;

例如,将产品表的名称改为 items 的命令如下:

alter table products rename to item;

三、删除表

删除表可以使用 DROP TABLE 语句:

DROP TABLE [ IF EXISTS ] name [ CASCADE | RESTRICT ];

其中,name 表示要删除的表;如果使用了 IF EXISTS,删除一个不存在的表不会产生错误,而是显示一个信息。如果被删除的表存在依赖于它的视图或外键约束,需要指定CASCADE 选项执行级联删除。

第六节Windows安装Postgres15数据库 (1)双击postgresql-15.2-1-windows-x64.exe 选择“是”(2)点击"Next >"(3)选择安装路径后,点击"Next >"(4)点击"Next >"(5)选择数据库文件路径后点击"Next >"(6)设置主密码,重复输入主密码后点击"Next >"超级管理员账号:postgres超级管理员密码:123456(6)使用默认端口号即可,点击"Next >"(7)选择新数据库集群要使用的区域设置,默认即可,点击"Next >" 阅读详情

相关推荐

【PostgreSQL】数据表膨胀(Table Bloat)的模拟和检测

PostgreSQL 数据表膨胀(Table Bloat)是指数据库表或索引在数据更新(如插入、删除、更新)后,所占用的磁盘空间增加,但实际有效数据量并未显著增长,导致存储空间的浪费。这种现象在 PostgreSQL 中比较常见,尤其是在高并发DML的更新操作下。

aichaoxy的博客 1364

PostgreSQL15.x安装教程

PostgreSQL 是一个功能强大的开源关系型数据库系统,基于 C 语言实现,采用 PostgreSQL 许可证,这是一种自由软件许可证,允许用户自由使用、修改和分发源代码,同时支持商业用途而不设强制限制。这使得 PostgreSQL 成为广受欢迎的开源数据库解决方案。PostgreSQL 支持跨版本升级,过程通常平稳。尽管国内市场 MySQL 仍占主导地位,但许多国产数据库(如华为的 GaussDB 和腾讯的 Tbase)及云服务提供商都广泛支持 PostgreSQL。此外,pgloader。

后端开发 2838

《PostgreSQL开发指南》第06篇 管理数据表

在关系型数据库中,用于存储数据的对象主要是表(table)。在上一篇中,我们已经了解到,表包含在模式中,模式包含在数据库中。接下来我们介绍如何管理数据库中的表,包括创建表、修改表以及删除表等操作。

Tony.Dong的专栏 1924

PostgreSQL 15新版本特性解读(含直播问答、PPT资料汇总)

2022年6月23日,墨天轮技术社区联合PostgreSQL中文社区共同举办【PostgreSQL 15 新特性解读】直播活动。为了方便大家回顾学习,小编整理了本次直播间的代表性问题请老师帮助解答,一起来学习吧!

Era666的博客 2615

车载通信技术原理-CAN通讯和代码配置:奥迪A6轿车总线拓扑图

CAN总线是一种用于汽车监测与控制系统的串行通信协议,由德国Bosch公司开发。它具有多主工作方式、优先级仲裁、高抗干扰等特点,支持点对点、广播等多种通信方式,传输距离可达10公里。CAN协议采用差分信号传输,物理层使用双绞线,数据链路层实现错误检测、位填充等功能。协议帧类型包括数据帧、遥控帧、错误帧等。CAN总线自1986年发布以来,已成为汽车电子系统的标准配置,广泛应用于车载网络。文章还提供了S32K144芯片的CAN驱动代码示例。

擎天柱工坊 1067

告别Root!用Termux+ADB在Android上玩转自动化(保姆级教程)

本文详细介绍了如何在非Root环境下使用Termux和ADB实现Android自动化操作,无需Root权限即可运行自动化脚本。通过Termux搭建Linux终端环境,结合ADB无线调试和Python脚本,实现点击、滑动、截图等自动化功能,适用于定时任务、自动签到等场景。

weixin_42548888的博客 539

【PostgreSQL】系列之 一 CentOS 7安装PGSQL15版本(一)

​ PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES, 版本 4.2为基础的对象关系型数据库管理系统(ORDBMS)。POSTGRES 领先的许多概念在很久以后才出现在一些商业数据库系统中。 PostgreSQL是最初的伯克利代码的开源继承者。它支持大部分 SQL 标准并且提供了许多特性。

康师傅没有眼泪 4325

LightTools宏 vs Python API:光学仿真自动化方案选型指南

本文深入对比了LightTools光学仿真自动化中VBA宏与Python API两种方案。VBA宏内嵌易用,适合固定流程批处理;Python API生态强大,尤其在参数优化算法集成方面优势显著,便于构建复杂工作流。文章结合案例,为不同场景下的技术选型提供清晰指南。

garlic的博客 940

15分钟快速验证:用PostgreSQL构建MVP数据后台

它把数据库安装、环境配置这些繁琐的步骤都自动化了,真正实现了"15分钟从零到可演示"的目标。特别是配合Kimi-K2模型的智能代码生成,连数据模型和接口都能自动创建,大大提升了原型开发效率。比如选择支持PostgreSQL的轻量级框架,它们通常已经内置了用户认证、权限管理等基础功能,我们只需要关注业务逻辑的实现。选择支持响应式设计的轻量级库,它们通常只需要几行配置就能生成基础的折线图、柱状图等。上,整个过程比想象中要简单很多,基本上跟着引导操作就能完成,特别适合非技术背景的创业者快速验证产品概念。

CrystalwaveEagle34的博客 111

安卓开发工程师在车载项目中的角色与技术实践

本文全面探讨了安卓开发工程师在车载项目中的关键角色,重点分析了技术栈(Kotlin/Java/Gradle)、岗位职责和任职要求。文章详细解读了车载安卓开发的核心技能,包括架构设计、性能优化和缺陷修复,并提供了20个针对性面试问题及答案。特别强调了车载环境的特殊需求,如硬件集成、安全认证和实时性要求。通过技术深度与实践案例的结合,为开发者和企业提供了从需求分析到系统优化的完整指导,旨在提升车载安卓开发的专业水平和招聘效率。

郑伟强dev的专栏 131

uniapp - 如何跟内嵌 web-view 组件内的网页交互,与 web-view 内嵌网页进行双向通信(uniapp 与 webview 网页之间的 “相互“ 传值)提供详细的示例代码及解决方案

uni-app如何实现在H5环境中与web-view中的网页交互通讯uniappuni-app 与 web-view内嵌网页 双向通信 如何跟内嵌web-view交互uniappAPP与webview子页面交互uniappAPP与webview子页面交互关于uni-app 使用 web-view 页面之间互相跳转、通信等问题uniapp的web-view嵌入网页,网页与uniapp通信webview如何与uniapp写的H5页面交互嵌套webview调用uniapp各种API组件实现H5和app通讯和交互

✅ 精选推荐文章 1万+

DBX安装教程:5分钟上手轻量级数据库管理工具(桌面端+Docker版)

DBX是一款仅15MB大小的轻量级跨平台数据库客户端,支持MySQL、PostgreSQL、SQLite、Redis、MongoDB等多种数据库,让你无需复杂配置即可快速管理各类数据库。本文将详细介绍桌面端和Docker两种安装方式,帮助你在5分钟内完成部署并开始使用。 ## 一、桌面端安装:3步完成极速部署 ### 1.1 获取安装包 访问项目仓库获取最新安装包: ```bash git

gitblog_01170的博客 1030

Python爬虫教程:抓取短视频平台数据(以抖音和快手为例)

为什么抓取短视频平台数据?内容分析:通过抓取短视频平台上的视频内容、标题、标签等数据,可以进行内容分类、趋势分析、话题分析等。情感分析:抓取视频的评论数据,并进行情感分析,帮助企业或组织了解公众的情绪反馈。用户行为分析市场监测:通过抓取特定关键词或标签下的视频数据,分析市场趋势,进行竞争对手分析。短视频平台数据类型:视频信息:包括视频标题、描述、标签、作者等。用户信息:包括用户的昵称、粉丝数、关注数等。互动数据评论数据:视频下的用户评论内容及用户信息。

2201_76125261的博客 3662

PostgreSQL15——管理表空间

表空间的名称不能以 pg_开头,它们是系统表空间的保留名称;LOCATION 参数必须指定绝对路径名,指定的目录必须是一个已经存在的空目录,PostgreSQL 操作系统用户(postgres)必须是该目录的拥有者,以便能够进行文件的读写。在PostgreSQL 中,表空间(tablespace)表示数据文件的存放目录,这些数据文件代表了数据库的对象,例如表或索引。默认情况下,执行 CREATE TABLESPACE 语句的用户为该表空间的拥有者,也可以使用OWNER 选项指定拥有者。

吴声子夜歌的博客 1452

AFSim2.9.0学习笔记 —— 4.1、创建项目,以此项目介绍工作中Wizard使用(红方/蓝方武器平台、阵营、更换图标等,多图详细介绍)

AFSim2.9.0学习笔记 —— 4.1、创建项目,以此项目介绍工作中Wizard使用(红方/蓝方武器平台、阵营、更换图标等,多图详细介绍)

2252

基于Cesium实现,动态水面+大坝排水动画

一、绘制面状水域,使用水波纹理,进行渲染,水体透明,可以看到底色。三、使用粒子系统,将喷泉改变方向,加上重力设置,实现排水动画。二、绘制线状三维体,用作模拟大坝拦截效果。四、最后,模拟水位上升,进行淹没分析,

一醉千秋的专栏 1420

postgresql实现对已有数据表分区处理的操作详解例子解析

在PostgreSQL中,对已有数据表进行分区处理可以提高数据管理的效率和查询性能。

IT老农民的博客 1532

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

PostgreSQL 15版本新特性一览

PostgreSQL 15版本保持我们一贯以来的标准,即提供稳定、可靠的世界上功能最为强大的开源的关系数据库系统。

ok3356的博客 3489

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【PostgreSQL003】PostgreSQL数据表空间膨胀,磁盘爆满,应用宕机(经验总结,已更新)

1.一直以来想写下基于PostgreSQL的系列文章,作为较火的数据ETL工具,也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下PostgreSQL数据库相关知识体系。空间膨胀(主键、外键、索引,增加删除等操作更新频繁)、磁盘爆满(回收机制不生效或不及时)、应用宕机(应用跟PG空间波动较大的数据库安装在同一台服务器) 3.欢迎批评指正,欢迎关注,跪谢一键三连!

kngines 2042

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

CentOS 7.9 安装部署 PostgreSQL 15 及备份还原

作用:为 CentOS 7.9 添加 PostgreSQL 15 的软件源,以便后续安装。是 PostgreSQL 默认管理员用户,操作数据库需用此用户。,安装 PostgreSQL 15 的服务器和客户端等组件。,初始化 PostgreSQL 的数据存储目录。,进入 PostgreSQL 命令行交互界面。,退出 PostgreSQL 命令行交互界面。的输出,确保系统为 CentOS 7.9。进入 PostgreSQL 命令行交互界面。,备份数据库到指定 SQL 文件。数据库的连接,为删除做准备。

2301_81426116的博客 856

基于Django+Vue的002-用设计学生成绩管理系统管理系统设计与实现【Python+PostgreSQL+SQLAlchemy完整源码】

开源免费分享基于Django+Vue的002-用设计学生成绩管理系统管理系统设计与实现【Python+PostgreSQL+SQLAlchemy完整源码】可提供说明文档 可以通过*AIGC**技术包括:MySQL、VueJS、ElementUI、(Python或者Java或者.NET)等等*功能如图所示。可以滴我获取详细的视频介绍

qq5_910946292的博客 522

PostgreSQL日常维护

定期维护:制定每周 / 每月维护计划,执行 VACUUM、统计信息更新和备份。性能监控:设置自动化监控系统,及时发现并处理慢查询和资源瓶颈。高可用部署:根据业务需求选择流复制或逻辑复制,确保数据冗余。文档与演练:完善故障恢复文档,定期进行灾难恢复演练。版本升级:关注 PostgreSQL 官方版本更新,适时升级以获取新特性和性能优化。

2501_91112123的博客 951

POSTGRESQL基本操作

POSTGRESQL基本操作 1.查看当前存在哪些数据库:\l 或者 select * from pg_database; 2.创建数据库: create database 数据库名; 3..查看当前存在哪些用户:\du 或者 select * rolnam from pg_roles; 或者 select * from pg_authid; 4.创建用户 create user 用户名 或者 create role 角色名 或者 create user 用户名 with pa

qq_40300123的博客 479

PostgreSQL 日常维护

具体说来,就是它必须要有你想备份的表的读 权限,因此为了备份整个数据库你几乎总是必须以一个数据库超级用户来运行它(如果你没有足够的特权 来备份整个数据库,你仍然可以使用诸如 -n schema 或-t table 选项来备份该数据库中你能够访问的部分)。psql 支持类似pg_dump 的选项用以指定要连接的数据库服务器和要使用的用户名。由 pg_dump 创建的备份在内部是一致的,也就是说,转储表现了 pg_dump开始运行时刻的数据库快照,且在 pg_dump 运行过程中发生的更新将不会被转储。

2501_91344566的博客 1247

学生考勤管理系统信息管理系统源码-Django后端+Vue前端+PostgreSQL【可直接运行】

开源免费分享学生考勤管理系统信息管理系统源码-Django后端+Vue前端+PostgreSQL【可直接运行】可提供说明文档 可以通过*AIGC**技术包括:MySQL、VueJS、ElementUI、(Python或者Java或者.NET)等等*功能如图所示。可以滴我获取详细的视频介绍

w707050的博客 766
上一篇: PostgreSQL15——数据库与模式
下一篇: PostgreSQL15——管理表空间
吴声子夜歌
博客等级 码龄9年 2687粉丝 2266原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值