postgresql-管理数据表

postgresql-管理数据表

  • 创建表
    • 数据类型
    • 字段约束
    • 表级约束
    • 模式搜索路径
  • 修改表
    • 添加字段
    • 删除字段
    • 添加约束
    • 删除约束
    • 修改字段默认值
    • 修改字段数据类型
    • 重命名字段
    • 重命名表
  • 删除表

创建表

在 PostgreSQL 中,使用 CREATE TABLE 语句创建一个新表:

CREATE TABLE table_name
(column_name data_type column_constraint,column_name data_type,...,table_constraint
);
  • 首先,table_name 指定了新表的名称
  • 括号内是字段的定义, column_name 是字段的名称, data_type 是它的类型,
    column_constraint 是可选的字段约束;多个字段使用逗号进行分隔
  • table_constraint 是可选的表级约束

数据类型

PostgreSQL 提供了丰富的内置数据类型,同时还允许用户自定义数据类型。最常见的基本
数据类型包括:

  • 字符类型,包括定长字符串 CHAR(n),变长字符串 VARCHAR(n),以及支持更大长度的
    字符串 TEXT。
  • 数字类型,包括整数类型 SMALLINT、INTEGER、BIGINT,精确数字 NUMERIC (p, s),
    浮点数 REAL、DOUBLE PRECISION
  • 时间类型,包括日期 DATE、时间 TIME、时间戳 TIMESTAMP
    官网关于类型的介绍

字段约束

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,定义检查约束
/** 员工表包含以下字段和约束:* employee_id , 员工 编 号, 整 数类 型 ,主 键 (通 过 表级 约 束为 主 键指 定 了名 称* emp_emp_id_pk);* first_name,名字,字符串;* last_name,姓氏,字符串,不能为空;* email,电子邮箱,字符串,不能为空,必须唯一(emp_email_uk);* phone_number,电话号码,字符串;* hire_date,雇佣日期,日期类型,不能为空;* salary,薪水,数字类型,必须大于零(emp_salary_min);* commission_pct,佣金百分比,数字类型;* manager_id,经理编号,外键(通过外键 emp_manager_fk 引用员工表的员工编号);* department_id,部门编号,外键(通过外键 emp_dept_fk 引用部门表 departments 的编号* department_id)* */
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_pkprimary key (employee_id), constraint emp_salary_mincheck (salary > 0), constraint emp_email_ukunique (email), constraint emp_dept_fkforeign key (department_id)references departments(department_id), constraint emp_manager_fkforeign 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;
-- where 语句后面添加1=2,保证只创建表结构,不复制数据
create table d2
as 
select * from departments where 1=2;

这种方法除了复制表结构之外,还可以复制数据。官网关于create table as介绍
select into官网介绍

模式搜索路径

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

CREATE TABLE schema_name.table_name

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

-- 我们先看一下当前的搜索路径:
show search_path;

在这里插入图片描述
搜索路径是一个逗号分隔的模式名称。当我们使用表的时候,PostgreSQL 会依次在这些模
式中进行查找,返回第一个匹配的表名;当我们创建一个新表时,如果没有指定模式名称,
PostgreSQL 会在第一个模式中进行创建。
第一个模式默认为当前用户名,如果不存在该模式,使用后面的公共模式(public)。

select user;

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

--我们可以通过 set 命令修改默认的搜索路径:
set search_path to app,public;

此时,如果我们再创建新表而不指定模式名称时,默认会在模式 app 中创建
官网模式的介绍

修改表

--创建产品表products
create table products(product_no integer primary key,name text,price numeric
);

添加字段

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

在这里插入图片描述
以上语句出错的原因在于新增的字段 notes 存在非空约束,但是对于已有的数据该字段的值
为空

解决方法如下:

  1. 添加约束的同时指定一个默认值
  2. 添加字段时不指定约束,将所有数据的字段值手动填充(UPDATE)之后,再添加约束
alter table products add column notes text default 'new product' not null;
select * from products;

在这里插入图片描述

删除字段

alter table 表名 drop column 列名;
--产品表中的 notes 字段删除:
alter table products drop column notes;

删 除 字 段 后 , 相 应 的 数 据 也 会 自 动 删 除 。 同 时 , 该 字 段 上 的 索 引 或 约 束
也会同时被删除。但是,如果该字段被其他对象(例如外键引用、视图、存储过程等)引用,无法直接删除
在 drop 的最后加上 cascade 选项即可级联删除依赖的对象

添加约束

alter table  表名 add 表级别约束;
alter table products add constraint products_price_min check(price > 0);
-- 非空约束语法
alter table 表名 alter column 列名 set not null;
--将产品表的 name 字段设置为非空
-- 添加约束时,系统会检验已有数据是否满足条件,如果不满足将会添加失败。
alter table products alter name set not null;

删除约束

alter table 表名 drop constraint 约束名称 [ restrict | cascade ];

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

--删除非空约束也需要使用单独的语法:
alter table 表名 alter column 列名 drop not null;
--删除产品表 name 字段上的非空约束
alter table products alter name drop not null;

修改字段默认值

--如果想要为某个字段设置或者修改默认值,可以使用以下语句:
alter table 表名 alter column 列名 set default 默认值;
--为产品表的价格设置一个默认值alter table products alter column price set default 7.77;
--删除已有的默认值
alter table 表名 alter column 列名 drop default;
--删除已有的默认值
-- 删除字段的默认值相当于将它设置为空值(NULL)。
alter table products alter column price drop default;

修改字段数据类型

-- 通常来说,可以将字段的数据类型修改为兼容的类型。
alter table 表名 alter column 列名 type 新的数据类型;
-- 修改表products的列price的类型为numeric
alter table products alter column price type numeric(10,2);
--已有的数据能够隐式转换为新的数据类型,如果无法执行隐式转换(例如将字符串‘1’转换为数字 1),
--可以使用 using 执行显式转换
alter table 表名 alter column 列名 type 新的数据类型 using
expression;
--我们先为产品表增加一个字符串类型的字段 level,然后将其修改为整数类型。
alter table products add column level varchar(10);--修改字段level为整数类型alter table products alter column level type integer using
level::integer;

重命名字段

alter table 表名 rename column 旧的列名 to 新的列名;

重命名表

alter table 旧的表名 rename to 新的表名;

删除表

drop tale官网介绍

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

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

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

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

相关文章

专业PDF编辑阅读工具PDF Expert mac中文特点介绍

PDF Expert mac是一款专业的PDF编辑和阅读工具。它可以帮助用户在Mac、iPad和iPhone等设备上查看、注释、编辑、填写和签署PDF文档。 PDF Expert mac软件特点 PDF编辑:PDF Expert提供了丰富的PDF编辑功能,包括添加、删除、移动、旋转、缩放、裁剪等操作…

树莓派4B与STM32串口通信

目录 2上篇文章的补充 2.1 树莓派通信设置 3树莓派与STM32通信 3.1接线准备 3.2代码 3.2.1 STM32代码: 3.2.2树莓派代码: 2上篇文章的补充 2.1 树莓派通信设置 在上篇文章的基础上,进一步的设置 终端输入:sudo minicom …

v-for中的key

在Vue中,当使用v-for指令循环渲染元素时,添加:key是一个推荐做法,尤其是在循环的元素可能会被重新排序、添加或删除的情况下。 :key的作用是为每个循环的元素提供一个唯一的标识符,以便Vue能够跟踪和管理这些元素的状态。Vue使用…

从 0 到 1 ,手把手教你编写《消息队列》项目(Java实现) —— 核心类持久化存储

文章目录 一、持久化存储的方式与路径二、公共模块序列化 / 反序列化异常规定 三、持久化存储数据库数据管理文件数据管理读写规定新增 /删除规定内存中 Message 的规定存储规定代码编写 硬盘数据管理 一、持久化存储的方式与路径 交换机,队列,绑定关系,这些我们使用数据库来管…

四、浏览器渲染过程,DOM,CSSDOM,渲染,布局,绘制详细介绍

知识点: 1、为什么不能先执行 js文件?? 我们不能先执行JS文件,必须等到CSSOM构建完成了才能执行JS文件,因为前面已经说过渲染树是需要DOM和CSSOM构建完成了以后才能构建,而且JS是可以操控CSS样式的&#…

编程前置:处理Excel表格,定位单元格位置,输入文字前,让AI机器人知道我说什么

原提问: input输入表头 (input内除了/,空格 回车 标点符号等 全部作为单元格分隔符) 由我设置input输入的是行or列 给选项 1. 行 2. 列 默认回车或没输入值是列由我设置起始位置行列 例如 3,2 表示3行2列 当我输入3,2 就表示在第…

【Java】继承练习

继承的思想实现猫和狗的案例,并在测试类中进行测试 猫和狗——共同特性都是属于动物 1. 定义动物类(Animal) 成员变量:姓名,年龄构造方法:无参,带参成员方法:get/set 方法 2. 定义猫…

springboot的配置文件(properties和yml/yaml)

springboot的配置文件有两种格式分别是properties和yml/yaml 创建配置文件 在创建springboot项目时候,会默认生成application.properties这种格式 书写风格 端口 application.propertis server.port8080 application.yml server:port: 8080 连接数据库 applica…

<Xcode> Xcode IOS无开发者账号打包和分发

关于flutter我们前边聊到的初入门、数据解析、适配、安卓打包、ios端的开发和黑苹果环境部署,但是对于苹果的打包和分发,我只是给大家了一个链接,作为一个顶级好男人,我认为这样是对大家的不负责任,那么这篇就主要是针…

【计算机网络黑皮书】应用层

【事先声明】 这是对于中科大的计算机网络的网课的学习笔记,感谢郑烇老师的无偿分享 书籍是《计算机网络(自顶向下方法 第6版)》 需要的可以私信我,无偿分享,课程简介下也有 课程连接 目录 应用层网络应用的原理应用架…

作业 day4

完成父子进程通信

Socket通信

优质博文IT-BLOG-CN 一、简介 Socket套接字:描述了计算机的IP地址和端口,运行在计算机中的程序之间采用socket进行数据通信。通信的两端都有socket,它是一个通道,数据在两个socket之间进行传输。socket把复杂的TCP/IP协议族隐藏在…

Linux基本指令(二)

💓博主个人主页:不是笨小孩👀 ⏩专栏分类:数据结构与算法👀 C👀 刷题专栏👀 C语言👀 🚚代码仓库:笨小孩的代码库👀 ⏩社区:不是笨小孩👀 🌹欢迎大…

接着聊聊如何从binlog文件恢复误delete的数据,模拟Oracle的闪回功能

看腻了文章就来听听视频演示吧:https://www.bilibili.com/video/BV1cV411A7iU/ delete忘加where条件(模拟Oracle闪回) 操作基本等同于上篇:再来谈谈如何从binlog文件恢复误update的数据,模拟Oracle的回滚功能 原理&a…

LCR 056.两数之和 IV

​​题目来源: leetcode题目,网址:LCR 056. 两数之和 IV - 输入二叉搜索树 - 力扣(LeetCode) 解题思路: 广度优先遍历二叉树的同时将已遍历过的节点值加入哈希表,若目标值与当前节点值之差存在…

java部分常见错误示例

Java中较为复杂和常见的错误示例,包括运行后的错误信息以及修复方法: 1. 空指针异常(NullPointerException) String text null; int length text.length(); // 运行后会抛出 NullPointerException错误信息: Exce…

敏捷开发的实施要素和实现敏捷的实际改进

敏捷开发的实施要素如下: 个体和交互:胜过过程和工具。可以工作的软件:胜过面面俱到的文档。客户合作:胜过合同谈判。响应变化:胜过遵循计划。 敏捷开发过程是一个增量的、迭代的过程,责任人、开发人员和…

SSM - Springboot - MyBatis-Plus 全栈体系(十五)

第三章 MyBatis 二、MyBatis 基本使用 4. CRUD 强化练习 4.1 准备数据库数据 首先,我们需要准备一张名为 user 的表。该表包含字段 id(主键)、username、password。创建SQL如下: CREATE TABLE user (id INT(11) NOT NULL AUT…

王杰国庆作业day3

父子进程对话 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <my_head.h> int main(int argc, const char *argv[]) {mkfifo("./fifo1",0664);mkfifo("./fifo2",0664);pid_t cpid fork();if(0 < cp…

_tkinter.TclError: no display name and no $DISPLAY environment variable 解决

启动kohya_ss时可能会发生错误&#xff1a; _tkinter.TclError: no display name and no $DISPLAY environment variable 解决办法&#xff1a; 1、apt-get install xvfb //安装xvfb // 启动虚拟显示器 2、Xvfb :99 -screen 0 1024x768x16 & export DISPLAY:99 ps aux…