Code Ease Code Ease
  • 个人博客网站 (opens new window)
  • 好用的工具网站 (opens new window)
  • Java核心基础
  • 框架的艺术
  • 分布式与微服务
  • 开发经验大全
  • 设计模式
  • 版本新特性
数据库系列
大数据+AI
  • xxl-job
运维与Linux
  • 基于SpringBoot和BootStrap的论坛网址
  • 基于VuePress的个人博客网站
  • 基于SpringBoot开发的小功能
  • 做一个自己的IDEA插件
程序人生
关于我
  • 分类
  • 标签
  • 归档

神秘的鱼仔

你会累是因为你在走上坡路
  • 个人博客网站 (opens new window)
  • 好用的工具网站 (opens new window)
  • Java核心基础
  • 框架的艺术
  • 分布式与微服务
  • 开发经验大全
  • 设计模式
  • 版本新特性
数据库系列
大数据+AI
  • xxl-job
运维与Linux
  • 基于SpringBoot和BootStrap的论坛网址
  • 基于VuePress的个人博客网站
  • 基于SpringBoot开发的小功能
  • 做一个自己的IDEA插件
程序人生
关于我
  • 分类
  • 标签
  • 归档
服务器
  • MySQL

  • Redis

  • MongoDB

  • PostgreSQL

    • PostgreSQL为什么值得学习
    • PostgreSQL的离线安装及问题解决
    • PostgreSQL中的数据库操作
      • 数据库的操作
        • 创建数据库
        • 列出所有数据库
        • 删除数据库
      • Template的操作
      • Schema的操作
        • 什么是Schema
        • 创建schema
        • 删除schema
        • 搜索路径
      • 总结
    • PostgreSQL中如何建好一张表
  • 数据库系列
  • PostgreSQL
CodeEase
2025-10-16
目录

PostgreSQL中的数据库操作

作者:鱼仔
博客首页: codeease.top (opens new window)
公众号:神秘的鱼仔

引言

在前面两篇博客中,我介绍了PostgreSQL的历史以及安装方式,从这篇博客开始介绍PostgreSQL的使用,首先就是最基础的库、schema、表操作。并且会和MySQL做一些比较,更方便大家了解。

# 数据库的操作

# 创建数据库

CREATE DATABASE mydatabase WITH OWNER user_test ENCODING 'UTF8' TEMPLATE template0;
1

这是一段创建数据库的完整命令,有两个和MySQL不一样的地方

1、编码格式UTF8:在MySQL中,建议编码格式设置为utf8mb4,主要的原因MySQL的UTF8是“阉割版”,只占用3个字节,因此在保存emoji表情,或者繁体汉字的时候就无法存储。PostgreSQL的UTF8是“满血版”,本身就使用4个字节存储,不会遇到MySQL的问题。

2、TEMPLATE:PGSQL默认有两个模板,分别是template0和template1,template0是无法修改的,template1可以修改。

新建数据库的时候,如果指定了对应的模板,该模板的结构(表、视图、函数、插件等)以及数据都会复制到新的数据库中。template0是一个干净的模板,没有任何结构和数据,并且无法被修改。template1在初始化的时候也是干净的,但是可以修改。

使用PGSQL创建库是如果不指定模板,默认都会使用template1。

# 列出所有数据库

select datname from pg_database;
1

通过这行SQL可以查询现在系统中存在的所有数据库,可以看到template0和template就在其中。

674X488/image.png

# 删除数据库

drop database mydatabase;
1

# Template的操作

前面已经介绍了template的作用,现在我们来自定义一个template

创建一个数据库:

CREATE DATABASE my_template;
1

接着切换到这个数据库,然后创建一张表

CREATE TABLE test_table (
    id SERIAL PRIMARY KEY,
    name TEXT
);
1
2
3
4

将这个数据库设置为模板:

UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'my_template';
1

现在这个数据库就变成模板了,模板无法直接被连接使用,现在来使用这个模板

create database test_table_2 template my_template;
1

可以看到新创建出来的数据库已经默认有模板中建的表了。

1732X676/image.png

# Schema的操作

# 什么是Schema

在MySQL中,database之下就是table。但是在PostgreSQL中,增加了一个Schema的中间层。这是一个逻辑的命名空间,可以理解为数据库内部的文件夹。可以隔离和管理数据库对象,还可以避免命名冲突。

388X268/image.png

创建完数据库之后,可以看到每个数据库都有一个默认的schema,叫做public。默认的表都会创建到这个public的schema中。

# 创建schema

create schema if not exists app_schema;
1

创建完成之后在数据库之下就会增加一个新的schema

476X286/image.png

后续在建表的时候,通过语句 create table app_schema.xxxtable 就可以在该schema之下创建新的表。

查询当前数据库下有哪些schema,会同时讲系统schema也查询出来。

select nspname from pg_namespace
1

# 删除schema

如果schema中没有任何的对象,可以通过下面的语句直接删除

drop schema app_schema;
1

如果该schema中已经有对象了,如果要强制全部删除的话就需要使用下面这段sql

drop schema app_schema cascade;
1

注意上面这段删除命令会同时将schema中的所有内容删除,删除前需要谨慎处理。

# 搜索路径

如果执行一段查询SQL:select * from user

但是不同的schema中又刚好都有一张user表,PGSQL会去查哪个schema呢?这就涉及到了一个叫做搜索路径的概念:

show search_path
1

发现输出了这样一段结果:

app_schema,"$user",public
1

说明会先去app_schema这个schema中查,再去"$user"中查,这是一个占位符,比如我当前登录用户叫做test_user,PGSQL就会去查询是否有test_user这个schema,最后到public去查询。

修改搜索路径的方式有三种,针对当前会话、针对某个用户、针对整个数据库

-- 设置搜索路径(会话级)
SET search_path TO public, app_schema;

-- 永久设置(用户级)
ALTER USER user_test SET search_path TO public, app_schema;

-- 永久设置(数据库级别)
ALTER DATABASE mydatabase SET search_path TO public, app_schema;
1
2
3
4
5
6
7
8

# 总结

PostgreSQL的功能相比MySQL增加了很多,从这一期讲到数据库就能大致看出来了,MySQL的结构只有数据库和数据表,PG增加了模板、Schema的概念,也让它增加了更多的功能性。下一篇我们讲解PG中的数据表--Table。

PostgreSQL的离线安装及问题解决
PostgreSQL中如何建好一张表

← PostgreSQL的离线安装及问题解决 PostgreSQL中如何建好一张表→

最近更新
01
PostgreSQL中如何建好一张表
10-16
02
PostgreSQL的离线安装及问题解决
10-16
03
PostgreSQL为什么值得学习
10-16
更多文章>
Theme by Vdoing | Copyright © 2023-2025 备案图标 浙公网安备33021202002405 | 浙ICP备2023040452号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式