PostgreSQL11 | pgsql建表、改表与删表

news2025/1/16 18:00:16

上一篇文章

PostgreSQL11 | pgadmin4基本使用http://t.csdn.cn/PKpde已经讲解了最简单的pgadmin的数据库创建、外键等可视化的操作,以及对应的pgsql语句

这一篇文章将讲解基础的pgsql语句

建表、改表与删表

目录

建表、改表与删表

创建数据表

单字段主键

多字段联合主键

外键约束

非空约束(Not Null Constraint)

唯一性约束(Unique Constraint)

默认约束(Default Constraint)

修改数据表

修改表名

修改字段的数据类型

修改字段名

添加字段

删除字段

删除表的外键约束

删除数据表

删除没有关联的表

IF EXISTS用法

删除被其他表关联的主表

postgresql11版本的新特性


创建数据表

创建数据表的关键字是CREATE

在为表名起名时,不区分大小写、不能起sql语句关键字(例如:DROP,CREATE等)

在为数据表中每一个列起名时,每个列之间使用英文逗号隔开

CREATE TABLE <表名>
(
    字段名1 数据类型 [列级别约束条件][默认值],
    字段名2 数据类型 [列级别约束条件][默认值],
    .....

    [表级别约束条件]
(

例:在pgtest数据库中创建员工表tb_emp1

字段名称数据类型备注
idINT员工编号
nameVARCHAR(25)员工名称
deptidINT所在部门编号
salaryFLOAT工资

CREATE TABLE tb_emp1
(
 	id INT,
	name VARCHAR(25),
	deptid INT,
	salary FLOAT
);

单字段主键

还可以在创建数据库表的时候对某一属性作主键约束,使得每条数据该属性的值表内唯一且不能为空,这与唯一约束不同。

创建一个数据表tb_emp2,id作为主键

CREATE TABLE tb_emp2
(
	id	INT PRIMARY KEY,
	name VARCHAR(25),
	deptid INT,
	salary FLOAT
);

 还可以在字段全部定义完,在最后加上主键指定

CREATE TABLE tb_emp3
(
	id INT,
	name VARCHAR(25),
	deptid INT,
	salary FLOAT,
	PRIMARY KEY(id)
);

多字段联合主键

当我想设计一个表中,name字段和deptid字段的值同步唯一的时候,就可以一次设置两个字段作为联合主键

create table tb_emp4
(
	name varchar(25),
	deptid int,
	salary float,
	primary key(name,deptid)
);

我们可以先存入一条数据

insert into tb_emp4 values ('小明',1,2000);

 通过pgadmin查表按钮之间查出表以便于我们快速输入测试数据看效果

 然后我们直接插入一条新数据,名字重复但部门id不重复

提示我们存储是成功的,反过来也是一样的,但如果当我们两个值全部与已存数据重复之后

 就会报错,所以当开发过程中有这种两个值做主键的需求时就会用到联合唯一

外键约束

用途:外键用来在两张表之间的数据建立链接,可以是一列或者多列。

定义:表中的一个字段,可以不是本表的主键,但必须是应对的另一表的主键。

对于外键来说,两张链接起来的表是有关联关系的

主表(父表):对于两个具有关联关系的表而言,相关联的字段中主键所在的哪个表就是主键。

从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所在的哪个表就是从表。

对于图形化工具pgadmin来说,只需要图形化操作即可,这一部分为了节省篇幅,请读者购买原教材(《postgresql11从入门到精通》清华大学出版社)对照第49页操作,我这里只总结sql语句操作。

先创建一个主表

create table tb_dept1
(
	id int primary key,
	name varchar(22) not null,
	location varchar(50)
);
字段名称数据类型备注
idint部门id
namevarchar(22)部门名称
locationvarchar(50)部门位置

之后再创建从表,从表中需要员工id、员工姓名、薪资之外,还有用于存储外键id的部门id字段

这个部门id字段要与主表中的主键(id)关联依赖,在建表时从表的建表sql如下

create table tb_emp5
(
	id int primary key,
	name varchar(25),
	deptid int,
	salary float,
	constraint fk_emp_dept1 foreign key(deptid) references tb_dept1(id)
);

关联公式解析:

constraint fk_emp_dept1 foreign key(deptid) references tb_dept1(id)
   约束      <约束名>       外键(字段名)      参照(依赖)  <主表表名>(主表主键字段)
                     (从表中存储主表id的字段)          

非空约束(Not Null Constraint)

用途:如果一张表中没有指定任何一个字段非空约束的话,有可能在存储的时候存储大量的全空的废数据,我们需要对表接收的数据进行约束,每条数据至少有一个值是存在的,这样存储的数据才有意义,所以

定义:被指定的字段的值不能为空

创建一个新表tb_emp6并指定员工的名称不能为空

create table tb_emp6
(
	id int primary key,
	name varchar(25) not null,
	deptid int,
	salary float,
	constraint fk_emp_dept2 foreign key(deptid) references tb_dept1(id)
);

当我们再次存储数据的时候,如果不给名字的值就会报错

唯一性约束(Unique Constraint)

定义:唯一性约束要求添加该约束的列字段的值唯一,允许为空,但只能出现一个空值。唯一性约束可以确保一列或多列不出现重复值。

唯一性约束(unique)与主键(primary key)的区别:一个表中可以有多个字段声明为unique,但只能由一个primary key声明;声明为primary key的列不允许有空值,但是声明为unique的字段允许有空值(NULL)的存在。

可视化操作在原教材书中第51页图片指导。

创建一个新的部门表tb_dept2并指定部门名称为唯一约束

有两种定义方式:

第一种,定义完列直接指定

create table tb_dept2
(
	id int primary key,
	name varchar(22) unique,
	location varchar(50)
);

<字段名> 数据类型 unique

第二种,定义完所有列后指定唯一约束

create table tb_dept3
(
	id int primary key,
	name varchar(22),
	location varchar(50),
	constraint sth unique(name)
);

constraint <约束名> unique(<字段名>)

默认约束(Default Constraint)

定义:默认约束指定某列的默认值

被指定默认约束的列,在插入或修改数据的时候,如果新结果没有传入用户的值,则会默认保存建表时指定的默认值,这个默认值可以通过修改数据表来修改默认值

定义一个新表tb_emp7,指定员工的部门编号默认为1111,为了方便展示这里与原教材不同,不再做主从表的关联

create table tb_emp7
(
	id int primary key,
	name varchar(25) not null,
	deptid int default 1111,
	salary float
);

创建表后插入一条只传id和name值的数据,其他两个值为空

insert into tb_emp7(id,name) values (1,'小明');

 可以看到虽然并没有传入deptid的值,但由于设置了默认约束,所以pgsql自动存储的预设的默认值。

修改数据表

修改数据表是指修改数据库中已经存在的数据库表的表结构。

常用的修改表的操作有:修改表名、修改字段数据类型或字段名、增加和删除字段、修改字段的排列位置、更改表的存储引擎、删除表的外键约束等。

修改表名

alter table <旧表名> rename to <新表名>;

例如我希望把前面创建的表tb_dept3修改成

alter table tb_dept3 rename to tb_department3;

 

修改字段的数据类型

对于创建好的字段,也可以修改它的数据类型。

alter table <表名> alter column <字段名> type <数据类型>;

例如,将表tb_dept1中的name字段的数据类型varchar(22)修改为text类型

alter table tb_dept1 alter column name type text;

但当表中该字段已经存有数据的时候,不可轻易修改数据类型。

举一个便于理解的例子。

我们可以对表中插入一条数据

insert into tb_dept1(id,name,location) values (1,'小王','shanghai');

当前name类型是text类型的,如果我们尝试修改回varchar(22),是没有问题的,因为值是在新类型的允许范围内的。

alter table tb_dept1 alter column name type varchar(22);

我们存储的数据是在varchar(22)的范围内的数据,但假如对已存数据不了解,贸然修改类型

返回上一状态,我们将名字修改成一串话

 再把数据类型修改为varchar(4)

alter table tb_dept1 alter column name type varchar(4);

对于varchar(4) 来说,已存在的值是超过范围的。

所以,不是不允许有值条件修改数据类型,而是需要对数据类型范围和已存值数据都了解的前提下修改,或者将数据清空后再修改字段的类型。有一些软件框架为了安全开发甚至直接不允许有值改类型的操作,所以最好是清理数据后改类型。

修改字段名

使用图形工具修改很简单,但下面讲如何通过sql来修改

alter table <表名> rename <待改名字段> to <新字段名><新数据类型,不写默认原类型>;

如果我想把表tb_dept1中的location修改字段名为loc,但数据类型不变

alter table tb_dept1 rename location to loc;

添加字段

表中的字段增减是正常的,现展示已存表增加字段的方法

alter table <表名> add column <新字段名,必填> <数据类型,必填>;

1.添加无完整性约束条件的字段

假如,现在对表tb_dept1增加新字段,一个没有完整性约束的int类型字段managerid(部门经理编号),sql如下

alter table tb_dept1 add column managerid int;

 2.添加有完整性约束条件的字段

在增加一个完整性约束条件的字段时,分为两个情况,一个是有默认值的一个是无默认值的。

假设再增加一个完整性约束的字段column1的话,sql如下

alter table tb_dept1 add column column1 varchar(12) not null default 'foo';

 这里需注意,我所展示的sql与原教材上的sql不同,完整性约束要求的字段在定义时有默认值,这个默认值在当前表中已有数据,但我们后加了新的完整性约束字段的话就会出现以下报错

 若我们不希望后续添加的完整性约束字段有默认值,就必须先将表中数据清理后再增加这一字段

delete from tb_dept1;

然后再运行这一sql

alter table tb_dept1 add column column2 varchar(12) not null;

删除字段

将表中的无用字段进行删除

alter table <表名> drop <字段名>;

例如将上面增加的字段managerid删掉,sql如下

alter table tb_dept1 drop managerid;

 

删除表的外键约束

对于数据库中定义的外键,如果不再需要,可以将其删除。外键一旦删除,就会解除主从表的关联关系。

alter table <表名> drop constraint <外键名>;

先新建一个新表tb_emp9,然后在该表以deptid字段创建一个外键关联tb_dept1表中的主键id

create table tb_emp9
(
	id int primary key,
	name varchar(25),
	deptid int,
	salary float,
	constraint fk_emp_dept foreign key(deptid) references tb_dept1(id)
);

 可以看到约束已经随表创建了,我们再对这一外键删除

alter table tb_emp9 drop constraint fk_emp_dept;

 

删除数据表

删除数据表是指将数据库中已经存在的表从数据库中删除。

删除没有关联的表

drop table <表名>;

例如,我要删除tb_emp2表

drop table tb_emp2;

IF EXISTS用法

在删除表时也有删除了一个不存在的表的时候,对于错误的sql,pgsql有一个提示警告而并非中断运行报错的方法

用法:

drop table if exists <表名>;

例如,同样的我们都是删除一个不存在的表xiaoming,使用前后

drop table xiaoming;

drop table if exists xiaoming;

删除被其他表关联的主表

在数据表中存在关联的主从表,如果直接删除主表的话,就会提示报错,这是因为主表的消失会破坏子表与主表的关联关系,如果必须删除主表则必须先删除所有有关联的子表外键之后再删除主表。

例如如下例子:

先创建一个表tb_dept3

create table tb_dept3
(
	id int primary key,
	name varchar(22),
	location varchar(50)
);

再创建子表

create table tb_emp10
(
	id int primary key,
	name varchar(25),
	deptid int,
	salary float,
	constraint fk_emp_dept foreign key(deptid) references tb_dept3(id)
);

如果这时贸然去删除主表则会报错

 就是因为子表外键导致的,所以要想要删掉主表就必须先删除子表的外键

alter table tb_emp10 drop constraint fk_emp_dept;

 然后再删除主表即可

drop table tb_dept3;

postgresql11版本的新特性

有关postgresql11版本的新特性——新增带默认值的字段不再重写数据表的相关内容请通过原教材《postgresql11从入门到精通》(清华大学出版社)第63页开始了解,属于11版本的新增功能,为了文章有普适性该部分作为自由了解范围,感谢理解。

作者的话(Alvin):

以上是有关原书第四章的总结与拓展,为提问与解答可以帮助更多人,本博客模拟GitHub的issue方案,所以私信已关,有问题请在评论区直接指正与提问,允许转发、复制或引用本文章,必须遵守开源法则注释来源与作者,感谢您的阅读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/155897.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

12.0、VMware-Linux部署springboot项目(图文超详细教程)

12.0、VMware-Linux部署springboot项目&#xff08;图文超详细教程&#xff09; 第一步&#xff1a;启动 Linux 进入 root 用户&#xff0c;打开终端 输入以下命令 -> 查看 Linux 中是否已经装有 jdk &#xff1b; java -version 1.如果有&#xff0c;需要先将原来的 jdk …

ESP-IDF:使用multimap和vector容器给新员工随机分配部门并按照部门打印

例程&#xff1a; /* 创建5个员工&#xff0c;给5个员工随机分配部门&#xff0c;然后按照部门打印员工*/ #include #include #include #include <time.h> #define SALEDEPARTMENT 1 #define RDDEPARTMENT 2 #define MEDEPARTMENT 3 class worker { public: string …

10分钟做好 Bootstrap Blazor 的表格组件导出 Excel/Word/Html/Pdf

上篇: Bootstrap Blazor 实战 通用导入导出服务(Table组件) 1.新建工程 新建工程b14table dotnet new blazorserver -o b14table将项目添加到解决方案中&#xff1a; dotnet sln add b14table/b14table.csproj使用 nuget.org 进行 BootstrapBlazor 组件安装, FreeSql sqlite…

在线阅读网站|基于Springboot+Vue开发实现小说阅读网站

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

探索SpringMVC-HandlerAdapter之RequestMappingHandlerAdapter

前言 在RequestMappingHandlerAdapter的第一篇文章《探索SpringMVC-HandlerAdapter之RequestMappingHandlerAdapter-参数解析》我们从方法调用的角度提出了三个问题。前面两篇分别回答了方法入参、返回值处理这两个问题。而第三个问题则是由异常处理器负责的&#xff0c;不属于…

栈的讲解及实现(图解+代码/C语言)

今天为大家分享的是栈的模拟实现&#xff0c;本文主要讲解如何以数组的形式模拟实现&#xff0c;同时给出链表模拟实现栈的代码。 目录 图解栈的结构数组模拟栈的分步实现 创建并初始化入栈检测栈是否为空出栈获取栈顶元素获取栈内有效元素个数销毁栈 链表模拟实现栈 模拟思…

学习笔记:统计建模方法的比较分析

前言本文介绍了隐马尔可夫模型 (HMM)、最大熵马尔可夫模型 (MEMM) 和条件随机场 (CRF) 的比较分析。 HMM、MEMM 和 CRF 是三种流行的统计建模方法&#xff0c;通常应用于模式识别和机器学习问题。 让我们更详细地探讨每种方法。一、隐马尔可夫模型 (HMM)“隐藏”一词象征着只有…

node ~ zip压缩 文件加密

我们知道zip压缩,文件加密都是基于http的,下面我用用node实现着几个功能 zip压缩/解压 let zlib require(zlib); // 核心 let path require(path); let fs require(fs);// 压缩流 将1.txt压缩成1.txt.gz function gzip(source){ //source文件目录let gzip zlib.createGzi…

[Android]View的事件分发机制(源码解析)

目录 1.分发对象-MotionEvent 2.如何传递事件 1.传递流程 2.事件分发的源码解析 3.主要方法&#xff1a; 4.事件传递中listener 5.滑动冲突如何用事件分发处理 1.分发对象-MotionEvent 事件类型有&#xff1a; 1.ACTION_DOWN-----手指刚接触屏幕 2.ACTION_MOVE------手…

ASIC和FPGA,选择哪种设计比较好?

很多人都觉得同样都是写Verilog的&#xff0c;ASIC和FPGA其实并没有什么区别&#xff0c;其实并不是这样。那么ASIC和FPGA&#xff0c;选择哪种设计比较好&#xff1f;接下来IC修真院就来为大家细细分析。 ASIC (Application Specific Integrated Circuit)&#xff0c;即专用集…

盘点:2022年勒索金额超百万美元的攻击事件

1、哥斯达黎加政府 勒索赎金&#xff1a;2000万美元 这是2022年最受关注的攻击事件&#xff0c;因为这是一个国家首次宣布进入“国家紧急状态”以应对勒索软件攻击。调查显示&#xff0c;从4月中旬到5月初&#xff0c;27个政府机构成为第一波攻击活动的目标。国家财政部数TB数…

生物化学 SY001盘尼西林

盘尼西林的发现与作用原理 发现历史略 青霉素 青霉素Penicillinβ&#xff0d;内酰胺类抗生素&#xff08;β&#xff0d;lactams&#xff09;青霉素类抗生素水溶性好&#xff0c;血消除半衰期大多不超过2小时音译盘尼西林抑制胞壁粘肽合成酶&#xff0c;从而使细菌胞壁缺损…

MOS管的<控制电路>与<防反接电路>

为了方便记忆&#xff0c;我不管D与S&#xff0c;只说MOS管中的二极管方向。 另外G是控制端 这是一篇只管结果的文章&#xff0c;大家只要记住就行。 懂原理vs记结果 懂原理以分析一切现象&#xff0c;但每次使用都要分析一次&#xff1b; 记结果方便使用&#xff0c;但出现问题…

1.1.1-了解什么是计算机

文章目录1 什么是计算机2 计算机硬件3 计算机软件3.1 应用软件3.2 系统软件3.3 主流的电脑操作系统有哪些4 Linux系统4.1 Linux系统介绍4.1 Linux系统版本5 计算机语言5.1 机器语言5.2 汇编语言5.3 人机交互6 计算机操作命令-DOS命令1 什么是计算机 计算机全称&#xff1a;电子…

Java基础学习笔记(十二)—— 数据结构

数据结构1 栈2 队列3 数组4 链表5 二叉树5.1 二叉树5.2 二叉查找树5.3 平衡二叉树5.4 红黑树6 哈希表数据结构是计算机存储、组织数据的方式。是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效率。…

【C++】stack queue priority_queue ...

&#x1f308;感谢阅读East-sunrise学习分享——stack & queue & 容器适配器 & prioity_queue & 反向迭代器 博主水平有限&#xff0c;如有差错&#xff0c;欢迎斧正&#x1f64f;感谢有你 码字不易&#xff0c;若有收获&#xff0c;期待你的点赞关注&#x1f…

SAP ABAP增强 BADI的增强全解析

BADI的全称是Business Add-in&#xff0c;它的主要技术是基于ABAP的对象来实现增强。SAP中BADI的维护事务代码是SE18和SE19&#xff0c;SE18主要是创建及维护BADI对象&#xff0c;而SE19用于维护BADI的实例&#xff0c;即如何来实现BADI对象的功能。 SAP的BADI因系统版本的差别…

K8S Deployment 使用 更新 回滚 扩容

K8S Deployments 使用 & 更新 & 回滚 & 扩容 K8S Deployments 提供比 Replication Controller 、ReplicaSet 更高一级的抽象&#xff0c;也具备更丰富的功能。Deployment对象不仅创建pod&#xff0c;还确保集群中始终运行正确数量的pod&#xff0c;处理可伸缩性&a…

Esp8266+TFT太空人天气时钟

开源项目&#xff0c;只对动手能力有要求&#xff0c;有现成程序 b站演示视频: https://www.bilibili.com/video/BV1ND4y1W7oS/?spm_id_from333.999.0.0 效果图 模块和接线方法 使用ESP8266-12F模块&#xff0c;4M空间。OLED使用1.3寸IPS 240*240点阵彩屏&#xff0c;ST7789…

【Java集合】ArrayList源码分析

目录 一、ArrayList介绍 1.1 简介 1.2 继承体系 二、源码剖析 2.1 成员属性 2.2 构造方法 2.2.1 带int类型的构造方法&#xff1a;ArrayList(int initialCapacity) 2.2.2 无参构造方法&#xff1a;ArrayList() 2.2.3 Collection型构造方法&#xff1a;ArrayList(Collection c) …