Appearance
PostgreSQL 基础操作速查
安装与启动
Debian/Ubuntu 安装
shell
# 安装 PostgreSQL
sudo apt update
sudo apt install postgresql postgresql-contrib
# 启动服务
sudo systemctl start postgresql
sudo systemctl enable postgresql
# 检查状态
sudo systemctl status postgresqlCentOS/RHEL 安装
shell
# 安装 PostgreSQL
sudo yum install postgresql-server postgresql-contrib
# 初始化数据库
sudo postgresql-setup initdb
# 启动服务
sudo systemctl start postgresql
sudo systemctl enable postgresql连接与认证
连接数据库
shell
# 连接默认数据库
sudo -u postgres psql
# 连接指定数据库
psql -U username -d database_name -h host -p port
# 连接字符串格式
psql "postgresql://username:password@host:port/database"修改密码
sql
-- 修改当前用户密码
ALTER USER postgres PASSWORD 'new_password';
-- 修改其他用户密码
ALTER USER username PASSWORD 'new_password';数据库操作
创建与删除
sql
-- 创建数据库
CREATE DATABASE database_name;
-- 创建数据库(指定编码)
CREATE DATABASE database_name
WITH ENCODING='UTF8'
LC_COLLATE='en_US.UTF-8'
LC_CTYPE='en_US.UTF-8'
TEMPLATE=template0;
-- 删除数据库
DROP DATABASE database_name;
-- 查看所有数据库
\l连接数据库
sql
-- 连接数据库
\c database_name
-- 查看当前数据库
SELECT current_database();表操作
创建表
sql
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);查看表结构
sql
-- 查看表结构
\d table_name
-- 查看所有表
\dt
-- 查看表详细信息
SELECT column_name, data_type, is_nullable
FROM information_schema.columns
WHERE table_name = 'table_name';修改表
sql
-- 添加列
ALTER TABLE table_name ADD COLUMN column_name data_type;
-- 修改列类型
ALTER TABLE table_name ALTER COLUMN column_name TYPE new_type;
-- 删除列
ALTER TABLE table_name DROP COLUMN column_name;
-- 重命名表
ALTER TABLE old_name RENAME TO new_name;数据操作
插入数据
sql
-- 插入单行
INSERT INTO users (username, email) VALUES ('john', 'john@example.com');
-- 插入多行
INSERT INTO users (username, email) VALUES
('alice', 'alice@example.com'),
('bob', 'bob@example.com');
-- 插入查询结果
INSERT INTO users (username, email)
SELECT username, email FROM temp_users;查询数据
sql
-- 基本查询
SELECT * FROM users;
-- 条件查询
SELECT * FROM users WHERE username = 'john';
-- 排序
SELECT * FROM users ORDER BY created_at DESC;
-- 分页
SELECT * FROM users LIMIT 10 OFFSET 0;
-- 聚合函数
SELECT COUNT(*), AVG(id) FROM users;
-- 分组
SELECT username, COUNT(*) FROM users GROUP BY username;更新数据
sql
-- 更新单行
UPDATE users SET email = 'new@example.com' WHERE id = 1;
-- 更新多行
UPDATE users SET email = 'updated@example.com' WHERE username LIKE 'a%';删除数据
sql
-- 删除单行
DELETE FROM users WHERE id = 1;
-- 删除所有数据
DELETE FROM users;
-- 清空表(重置序列)
TRUNCATE TABLE users;索引操作
创建索引
sql
-- 创建B-tree索引
CREATE INDEX idx_users_email ON users(email);
-- 创建唯一索引
CREATE UNIQUE INDEX idx_users_username ON users(username);
-- 创建复合索引
CREATE INDEX idx_users_username_email ON users(username, email);
-- 查看索引
\di table_name删除索引
sql
DROP INDEX idx_users_email;用户与权限
创建用户
sql
-- 创建用户
CREATE USER username WITH PASSWORD 'password';
-- 创建用户(带数据库权限)
CREATE USER username WITH PASSWORD 'password' CREATEDB;授权
sql
-- 授予数据库权限
GRANT ALL PRIVILEGES ON DATABASE database_name TO username;
-- 授予表权限
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO username;
-- 授予特定表权限
GRANT SELECT, INSERT, UPDATE ON users TO username;
-- 撤销权限
REVOKE ALL PRIVILEGES ON users FROM username;备份与恢复
备份数据库
shell
# 备份单个数据库
pg_dump -U username database_name > backup.sql
# 备份所有数据库
pg_dumpall -U username > all_databases.sql
# 备份为压缩格式
pg_dump -U username -Fc database_name > backup.dump恢复数据库
shell
# 恢复SQL格式
psql -U username database_name < backup.sql
# 恢复压缩格式
pg_restore -U username -d database_name backup.dump性能优化
查看查询计划
sql
EXPLAIN ANALYZE SELECT * FROM users WHERE username = 'john';查看慢查询
sql
-- 启用慢查询日志
ALTER SYSTEM SET log_min_duration_statement = 1000; -- 超过1秒的查询
SELECT pg_reload_conf();查看连接数
sql
SELECT count(*) FROM pg_stat_activity;常用函数
字符串函数
sql
-- 长度
SELECT length('hello');
-- 拼接
SELECT 'hello' || ' ' || 'world';
-- 替换
SELECT replace('hello world', 'world', 'PostgreSQL');
-- 截取
SELECT substring('hello world' from 1 for 5);日期函数
sql
-- 当前时间
SELECT NOW();
SELECT CURRENT_TIMESTAMP;
-- 日期加减
SELECT NOW() + INTERVAL '1 day';
SELECT NOW() - INTERVAL '1 month';
-- 日期格式化
SELECT TO_CHAR(NOW(), 'YYYY-MM-DD HH24:MI:SS');系统信息
查看版本
sql
SELECT version();查看数据库大小
sql
SELECT pg_size_pretty(pg_database_size('database_name'));查看表大小
sql
SELECT pg_size_pretty(pg_total_relation_size('table_name'));查看活动连接
sql
SELECT * FROM pg_stat_activity WHERE state = 'active';紧急处理
终止查询
sql
-- 终止指定查询
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE pid = 123;
-- 终止所有长时间运行的查询
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state = 'active' AND query_start < NOW() - INTERVAL '1 hour';锁定处理
sql
-- 查看锁定
SELECT * FROM pg_locks WHERE NOT granted;
-- 解除锁定
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE pid IN (SELECT pid FROM pg_locks WHERE NOT granted);