作者介绍:简历上没有一个精通的运维工程师,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。
MySQL
PostgreSQL(本章节)
Redis
Etcd
我们在介绍MYSQL的时候也介绍过增删改查,PostgreSQL对于数据的增删改查和MYSQL几乎是一模一样的,在对库,表的操作语法也很相近,我们今天主要介绍是对于库表的增删改查。
-- 查询(两者相同)
SELECT * FROM users WHERE age > 25;
-- 插入(两者相同)
INSERT INTO users (name, email) VALUES ('张三', 'zhangsan@example.com');
-- 更新(两者相同)
UPDATE users SET age = 30 WHERE name = '张三';
-- 删除(两者相同)
DELETE FROM users WHERE id = 1;C (Create): 创建数据库
-- 基本创建,这个和mysql是一致的
CREATE DATABASE abcd;
-- 创建并指定字符集(PostgreSQL 中称为“编码”)和排序规则
CREATE DATABASE efg
ENCODING 'UTF8' -- 字符编码(对应 MySQL 的 CHARSET)
LC_COLLATE 'zh_CN.UTF-8' -- 排序规则(对应 MySQL 的 COLLATE)
LC_CTYPE 'zh_CN.UTF-8'; -- 字符分类(影响字符串处理,MySQL 无此参数)-- 列出所有数据库-MYSQL
SHOW DATABASES;-- Pg就和mysql完全不一样了
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(3 rows)D (Delete): 删除数据库
-- 删除 test_db 数据库(危险!谨慎操作),这个和mysql是一致的。
DROP DATABASE test_db;#mysql
USE test_db;
#pg-- 切换到 test_db 数据库
\c test_db;C (Create): 创建表
-- 创建用户表(基本结构)
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT, -- MySQL 自增语法
name VARCHAR(50) NOT NULL,
age INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- PostgreSQL 中自增语法不同(用 SERIAL 或 identity)
CREATE TABLE users (
id SERIAL PRIMARY KEY, -- 等价于 MySQL 的 AUTO_INCREMENT(旧版)
-- 或 PostgreSQL 10+ 推荐:id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);R (Read): 查询表
-- mysql
SHOW TABLES;
-- 方法1:使用 psql 客户端特有命令(常用,简洁)
\dt
-- 方法2:查询系统表(SQL 标准语法,可在任何客户端使用)
SELECT tablename FROM pg_tables WHERE schemaname = 'public';-- mysql 查看表结构
desc TABLES;
-- pg 查看users表结构
\d users;U (Update): 修改表
这是DDL(数据定义语言)中非常重要的部分,用于调整表结构。
-- ============ 添加列 ============
-- PostgreSQL
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
-- MySQL
ALTER TABLE users ADD phone VARCHAR(20);
-- ============ 修改列类型 ============
-- PostgreSQL
ALTER TABLE users ALTER COLUMN age TYPE INT;
-- MySQL
ALTER TABLE users MODIFY age INT;
-- ============ 重命名列 ============
-- PostgreSQL
ALTER TABLE users RENAME COLUMN phone TO phone_number;
-- MySQL (两种方式)
ALTER TABLE users CHANGE phone phone_number VARCHAR(20);
-- 或 MySQL 8.0+
ALTER TABLE users RENAME COLUMN phone TO phone_number;
-- ============ 删除列 ============
-- PostgreSQL
ALTER TABLE users DROP COLUMN phone_number;
-- MySQL
ALTER TABLE users DROP phone_number;
-- ============ 添加主键 ============
-- PostgreSQL
ALTER TABLE users ADD PRIMARY KEY (id);
-- MySQL
ALTER TABLE users ADD PRIMARY KEY (id);
-- ============ 添加外键 ============
-- PostgreSQL (必须命名约束)
ALTER TABLE orders ADD CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id);
-- MySQL (可自动命名)
ALTER TABLE orders ADD FOREIGN KEY (user_id) REFERENCES users(id);
-- ============ 添加索引 ============
-- PostgreSQL
CREATE INDEX idx_users_email ON users (email);
-- MySQL (两种方式)
CREATE INDEX idx_users_email ON users (email);
-- 或
ALTER TABLE users ADD INDEX idx_users_email (email);
-- ============ 设置NOT NULL约束 ============
-- PostgreSQL
ALTER TABLE users ALTER COLUMN email SET NOT NULL;
-- MySQL
ALTER TABLE users MODIFY email VARCHAR(100) NOT NULL;D (Delete): 删除表 【警告】此操作非常危险,会直接删除表及其所有数据,务必谨慎!
#pg和mysql是一样的
DROP TABLE users;