PostgreSQL 数据库日常应用
一、连接与基础命令
1. 命令行连接
bash
运行
# 本地
psql -U postgres -d dbname
# 远程
psql -h 192.168.x.x -p 5432 -U postgres -d dbname
2. psql 常用元命令
\l:列出所有数据库\c dbname:切换数据库\dt:查看当前库所有表\d tablename:查看表结构\du:查看所有用户 / 角色\q:退出\?:帮助
二、库与表操作
1. 数据库
sql
CREATE DATABASE testdb;
DROP DATABASE IF EXISTS testdb;
-- 查看库大小
SELECT pg_size_pretty(pg_database_size('testdb'));
2. 建表(常用模板)
sql
CREATE TABLE t_user (
id SERIAL PRIMARY KEY,
name VARCHAR(32) NOT NULL,
phone VARCHAR(11),
create_time TIMESTAMP DEFAULT now()
);
-- 注释
COMMENT ON TABLE t_user IS '用户表';
COMMENT ON COLUMN t_user.name IS '姓名';
3. 表结构修改
sql
ALTER TABLE t_user ADD COLUMN age INT;
ALTER TABLE t_user RENAME COLUMN age TO user_age;
ALTER TABLE t_user ALTER COLUMN phone SET NOT NULL;
DROP TABLE IF EXISTS t_user;
三、数据 CRUD
1. 插入
sql
INSERT INTO t_user(name, phone) VALUES ('张三', '13800138000');
-- 批量插入
INSERT INTO t_user(name) VALUES ('李四'),('王五');
-- 存在则更新(UPSERT)
INSERT INTO t_user(id,name) VALUES (1,'张三')
ON CONFLICT (id) DO UPDATE SET name=EXCLUDED.name;
2. 查询
sql
SELECT * FROM t_user WHERE id=1;
-- 分页
SELECT * FROM t_user LIMIT 10 OFFSET 0;
-- 模糊(不区分大小写)
SELECT * FROM t_user WHERE name ILIKE '%张%';
-- 聚合
SELECT count(*) FROM t_user;
3. 更新 & 删除
sql
UPDATE t_user SET phone='13900001111' WHERE id=1;
DELETE FROM t_user WHERE id=1;
TRUNCATE TABLE t_user; -- 清空表(快,不可回滚)
四、用户与权限
1. 创建用户
sql
CREATE USER app_user WITH LOGIN PASSWORD '123456';
2. 只读权限
sql
GRANT CONNECT ON DATABASE testdb TO readonly_user;
GRANT USAGE ON SCHEMA public TO readonly_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_user;
-- 未来新建表自动授权
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO readonly_user;
3. 读写权限
sql
GRANT SELECT,INSERT,UPDATE,DELETE ON t_user TO app_user;
REVOKE DELETE ON t_user FROM app_user;
五、索引与常用维护
1. 建索引
sql
CREATE INDEX idx_user_phone ON t_user(phone);
2. 查看执行计划
sql
EXPLAIN ANALYZE SELECT * FROM t_user WHERE phone='13800138000';
3. 表统计信息 / 清理
sql
ANALYZE t_user; -- 更新统计信息
VACUUM ANALYZE t_user;-- 清理死元组+分析
4. 查看表大小
sql
SELECT pg_size_pretty(pg_relation_size('t_user'));
六、备份与恢复
1. 备份(pg_dump)
bash
运行
pg_dump -U postgres -d testdb -f testdb.sql
2. 恢复
bash
运行
psql -U postgres -d testdb -f testdb.sql
七、常用系统查询
sql
-- 查看连接数
SELECT count(*) FROM pg_stat_activity;
-- 查看慢查询/活跃SQL
SELECT query,state,pid FROM pg_stat_activity WHERE state!='idle';
-- 杀进程
SELECT pg_terminate_backend(pid);