安装
注意在使用 docker up -d
启动容器时之前, 需要准备默认的数据
sh
# 1.注意需要从一个临时容器中并复制一份默认的数据
docker run --name tmp && docker cp tmp:/var/lib/postgresql/data ./data
# 2.注意删除临时容器
docker stop tmp && docker rm tmp
# 3.注意修改目录权限
chmod -R 777 ./data
yaml
services:
postgres15:
image: postgres:15
restart: always
container_name: pgsql15
environment:
POSTGRES_USER: admin # 用户
POSTGRES_PASSWORD: admin@123456 # 用户密码
POSTGRES_HOST_AUTH_METHOD: trust # 允许所有用户访问
ports:
- 5432:5432
volumes:
- ./data:/var/lib/postgresql/data # postgresql 数据
- ./init:/docker-entrypoint-initdb.d # 初始化脚本(只会在首次启动时执行一次)
数据库操作
sh
# 链接数据库
# -h 链接数据库地址
# -p 端口
# -U 用户名(默认会链接同一用户名创建的数据库)
# -d 数据库名(链接指定数据库)
# -W 输入密码
psql -h 127.0.0.1 -p 5432 -U admin -W
# 创建数据库
create database db1;
create database db2;
# 删除数据
drop database db2;
# 查看数据库
\l
# 切换数据库(类似mysql: use db1)
\c db1
# 查看当前数据库所有的表
\d
# 断开链接(退出psql链接后的终端)
\q
数据表操作
数据类型了解
字段约束
- primary key: 主键
- not null: 非空
- unique: 唯一
- default: 默认值
- check: 检查条件
数据表操作
sql
-- 创建表(SQL语法是通用的, 仅需注意字段的数据类型)
create table users(
id serial primary key,
name varchar(255) not null,
age int not null,
email varchar(255) unique not null,
password varchar(255) not null,
created_at timestamp default current_timestamp,
updated_at timestamp default current_timestamp
);
-- 查看当前数据库所有的表
\d;
-- 查看 users 表的结构
\d users;
-- 删除数据表
drop table users;
-- 重命名数据表
alter table products rename to goods;
-- 修改表结构: 添加字段
-- 向 users 表中添加 一个 height 字段
alter table users add height int not null;
-- 修改表结构: 修改字段
-- 修改 users 表中 height 字段为 varchar 类型
alter table users alter column height type varchar(8);
-- 修改表结构: 删除字段
-- 删除 users 表中的 height 字段
alter table users drop column height;
-- 修改表结构: 重命名字段
-- 修改产品表中的 product_no 字段为 product_id
alter table products rename column product_no to product_id;
schema 模式
与 MySQL 不同, PostgreSQL 有 schema(可以理解为命名空间), 用于管理数据库对象表, 默认所有的表都放在 public
这个命令空间下, 在创建表的时候可以指定命名空间
sql
-- 查看当前数据库所有的命名空间
\dn;
-- 创建命名空间
create schema dev;
-- 创建表(并指定命名空间)
create table dev.users(
id serial primary key,
name varchar(255) not null
);
-- 查询指定命名空间下的表
select * from dev.users;
-- 指定默认执行查询的 shcema
set search_path to dev;
select * from users;
数据表记录操作
postgres 的数据表记录操作, 支持标准的 SQL 语句, 具体参考 MySQL 笔记即可
sql
-- 查询
-- select -> from -> where -> group by -> having -> order by -> limit
-- select * from your_table where filed=value;
-- 插入
-- insert into your_table(filed1,filed2) values(value1,value1), (value2,value2);
-- 修改
-- update your_table set filed=value where filed=value;
-- 删除
-- delete from your_table where filed=value;
备份与导入
sh
## 备份数据库(注意这是个系统命令,所以需要进入到 docker 容器内部然后执行)
pg_dump -h 127.0.0.1 -U admin -W -d db1 > db1_backup.sql
## 导入并执行 SQL
# 1. 先创建数据库确保 db1backup 存在
createdb db1bakup -h 127.0.0.1 -U admin -W
# 2. 手动导入数据(包括命名空间,表结构,表数据)
psql -h 127.0.0.1 -U admin -W -d db1bakup -f db1_backup.sql
# 如果环境是 docker, 可以指定 volumes 让容器启动时自动执行来导入数据
# volumes:
# - ./init:/docker-entrypoint-initdb.d/ # 初始化脚本(只会在首次启动时执行一次)
事物处理机制
事物提交模式
postgres 的事物处理机制, 与 MySQL 相似
sql
-- 开启单个事物
begin;
insert into users (name) values('tom'), ('jerry');
update users set email='tom@qq.com' where name='tom';
update users set email='jerry@qq.com' where name='jerry';
commit;
-- 开启全局事物(关闭自动提交)
\set AUTOCOMMIT off
-- 开启自动提交
\set AUTOCOMMIT on
事物隔离级别
sql
-- 查看当前会话事物隔离级别
show transaction isolation level;
-- 查看全局事物隔离级别
show default_transaction_isolation;
-- 设置当前会话事物隔离级别
set session characteristics as transaction isolation level serializable;
-- 设置全局事物隔离级别
alter system set default_transaction_isolation = 'repeatable read';
select pg_reload_conf(); -- 重新加载配置
-- 设置单个事物的隔离界别
begin;
set transaction isolation level serializable;
-- 执行事务操作...
commit;
锁机制
postgres 锁机制 与 MySQL 不同, 可阅读postgres官方文档
用户管理
sh
# 1. 查看用户
\du
# 2. 创建用户并设置密码(默认为普通用户)
create user dev password 'dev123456';
create user root superuser password 'root123456'; # 创建超级管理员用户
# 4. 修改用户密码
alter user dev password '123456';
# 3. 删除用户
drop user dev;
drop user root;