平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“PostgreSQL数据库从入门到精通实践”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
从实现思路看,这是一份详细的 PostgreSQL 数据库采用指南,涵盖核心概念、操作、管理和优化实践。
理解这一步时,PostgreSQL 是一个功能强大、开源的对象关系型数据库管理系统 (ORDBMS)。它以其高度的 SQL 标准兼容性、强大的功能集(如 JSON 兼容、地理空间数据处理、全文搜索)、可扩展性(借助扩展)以及可靠性(ACID 事务兼容)而闻名。
sudo apt-get update && sudo apt-get install postgresql postgresql-contribsudo yum install postgresql-server postgresql-contribbrew install postgresqlsudo postgresql-setup initdbinitdb -D /usr/local/var/postgres (路径可能不同)sudo systemctl start postgresqlbrew services start postgresqlpg_ctl 命令。postgres 的超级用户。psql -U username -d dbname -h hostname -p port-U: 用户名 (如 postgres)-d: 数据库名 (默认 postgres)-h: 主机 (默认 localhost)-p: 端口 (默认 5432)psql 内:q: 退出l: 列出所有数据库c dbname: 切换到数据库 dbnamedt: 列出当前数据库的所有表d tablename: 查看表 tablename 的结构?: 查看帮助e: 打开编辑器编辑当前查询i filename: 执行 SQL 脚本文件 filenametiming: 切换命令执行时间显示CREATE DATABASE mydatabase;
-- 指定所有者
CREATE DATABASE mydatabase OWNER myuser;
-- 指定编码 (推荐 UTF8)
CREATE DATABASE mydatabase ENCODING 'UTF8';
落到代码里,在 PostgreSQL 里,"角色"(Role)能够代表用户(User)或用户组(Group)。
-- 创建登录角色 (用户)
CREATE ROLE myuser WITH LOGIN PASSWORD 'mypassword';
-- 创建超级用户
CREATE ROLE adminuser WITH LOGIN PASSWORD 'adminpass' SUPERUSER;
-- 修改密码
ALTER ROLE myuser WITH PASSWORD 'newpassword';
CREATE TABLE employees (
id SERIAL PRIMARY KEY, -- SERIAL 通常用于自动递增主键
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
hire_date DATE NOT NULL,
salary NUMERIC(10, 2) CHECK (salary > 0),
department_id INTEGER REFERENCES departments(id) -- 外键约束
);
常用数据类型:
INTEGER, SMALLINT, BIGINTNUMERIC(precision, scale), DECIMAL(precision, scale) - 精确数值REAL, DOUBLE PRECISION - 浮点数VARCHAR(n), CHAR(n), TEXTBOOLEANDATE, TIME, TIMESTAMP, INTERVALJSON, JSONB (二进制 JSON, 更高效)UUIDARRAYGEOMETRY (PostGIS 扩展)插入数据 (Create):
INSERT INTO employees (first_name, last_name, email, hire_date, salary, department_id)
VALUES ('John', 'Doe', '[email protected]', '2023-01-15', 60000.00, 1);
-- 插入多条
INSERT INTO employees (...) VALUES (...), (...), (...);
查询数据 (Read):
-- 基本查询
SELECT * FROM employees;
-- 选择特定列
SELECT first_name, last_name, salary FROM employees;
-- 条件过滤 (WHERE)
SELECT * FROM employees WHERE salary > 50000;
SELECT * FROM employees WHERE hire_date BETWEEN '2022-01-01' AND '2023-12-31';
SELECT * FROM employees WHERE last_name LIKE 'Sm%'; -- 模糊匹配
-- 排序 (ORDER BY)
SELECT * FROM employees ORDER BY salary DESC;
-- 限制结果集 (LIMIT, OFFSET)
SELECT * FROM employees ORDER BY hire_date DESC LIMIT 10 OFFSET 20; -- 分页
-- 聚合函数 (COUNT, SUM, AVG, MIN, MAX)
SELECT COUNT(*) FROM employees;
SELECT department_id, AVG(salary) AS avg_salary FROM employees GROUP BY department_id;
SELECT department_id, AVG(salary) FROM employees GROUP BY department_id HAVING AVG(salary) > 50000; -- HAVING 过滤分组
-- 连接查询 (JOIN)
SELECT e.first_name, e.last_name, d.name AS department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;
-- 子查询
SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);
更新数据 (Update):
UPDATE employees SET salary = salary * 1.05 WHERE department_id = 3; -- 给部门3的员工涨薪5%
UPDATE employees SET email = '[email protected]' WHERE id = 42;
删除数据 (Delete):
DELETE FROM employees WHERE id = 100; -- 删除特定行
DELETE FROM employees; -- 删除所有行 (危险!通常用 TRUNCATE 更快)
TRUNCATE TABLE employees; -- 快速清空表,重置序列 (如果有),但无法触发 DELETE 触发器
TRUNCATE TABLE employees RESTART IDENTITY; -- 同时重置关联的序列
索引是加速查询的关键。
CREATE INDEX idx_employees_last_name ON employees (last_name);
CREATE INDEX idx_employees_department_salary ON employees (department_id, salary); -- 复合索引
-- 唯一索引 (通常由 UNIQUE 约束自动创建)
CREATE UNIQUE INDEX idx_employees_email ON employees (email);
@>, <@, &&)的数据类型,如数组、JSONB、全文搜索。d tablename 或 SELECT * FROM pg_indexes WHERE tablename = 'employees';REINDEX INDEX idx_name; 或 REINDEX TABLE table_name; 或 REINDEX DATABASE db_name;结合项目来看,PostgreSQL 采用 MVCC (多版本同时发控制) 来管理并发访问。
BEGIN; -- 或 START TRANSACTION;
-- 执行一系列 SQL 语句
UPDATE accounts SET balance = balance - 100.00 WHERE id = 1;
UPDATE accounts SET balance = balance + 100.00 WHERE id = 2;
COMMIT; -- 提交事务
-- 如果出错
ROLLBACK; -- 回滚事务
READ COMMITTED (默认)REPEATABLE READSERIALIZABLESET TRANSACTION ISOLATION LEVEL ...; (在 BEGIN 之后)视图是基于一个或多个表的查询结果的虚拟表。
-- 创建视图
CREATE VIEW employee_summary AS
SELECT e.id, e.first_name, e.last_name, d.name AS department, e.salary
FROM employees e
JOIN departments d ON e.department_id = d.id;
-- 查询视图
SELECT * FROM employee_summary WHERE department = 'Engineering';
-- 更新视图 (有限制条件,需满足特定规则)
CREATE OR REPLACE VIEW ... -- 修改视图定义
DROP VIEW employee_summary; -- 删除视图
PostgreSQL 兼容多种过程语言,最常用的是 PL/pgSQL。
-- 简单函数示例
CREATE OR REPLACE FUNCTION get_employee_count(dept_id INTEGER)
RETURNS INTEGER AS $$
DECLARE
emp_count INTEGER;
BEGIN
SELECT COUNT(*) INTO emp_count
FROM employees
WHERE department_id = dept_id;
RETURN emp_count;
END;
$$ LANGUAGE plpgsql;
-- 调用函数
SELECT get_employee_count(1);
在这个场景下,触发器在特定事件(INSERT, UPDATE, DELETE)发生时自动执行一个函数。
-- 创建触发器函数 (记录员工薪资变更)
CREATE OR REPLACE FUNCTION log_salary_change()
RETURNS TRIGGER AS $$
BEGIN
IF NEW.salary <> OLD.salary THEN
INSERT INTO salary_history (employee_id, old_salary, new_salary, change_time)
VALUES (OLD.id, OLD.salary, NEW.salary, NOW());
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- 创建触发器
CREATE TRIGGER track_salary_change
AFTER UPDATE OF salary ON employees -- 仅当 salary 列更新时触发
FOR EACH ROW
EXECUTE FUNCTION log_salary_change();
PostgreSQL 的功能能够借助扩展来增强。
SELECT * FROM pg_available_extensions;CREATE EXTENSION extension_name; (需超级用户权限)dx 或 SELECT * FROM pg_extension;理解这一步时,主要设置文件,控制数据库行为(内存、连接、日志、复制等)。位置通常在数据目录下。
listen_addresses: 地址 ('*' 表示所有 IP)。port: 端口 (默认 5432)。max_connections: 最大同时发连接数。shared_buffers: 共享内存缓冲区大小(通常设为系统内存的 25%)。work_mem: 每个操作(排序、哈希)可用的内存。maintenance_work_mem: VACUUM, CREATE INDEX 等维护操作采用的内存。wal_level: 预写日志级别(影响复制和备份)。fsync: 是否确保数据写入磁盘(通常 on)。postgresql.conf。ALTER SYSTEM SET parameter_name = 'value'; (需 superuser 权限,修改 postgresql.auto.conf)。SELECT pg_reload_conf(); (无需重启) 或重启 PostgreSQL 服务。GRANT SELECT, INSERT, UPDATE ON TABLE employees TO myuser; -- 授予表权限
GRANT ALL PRIVILEGES ON DATABASE mydatabase TO adminuser; -- 授予数据库所有权限
GRANT USAGE ON SCHEMA public TO myuser; -- 授予模式使用权限 (通常是必要的)
REVOKE UPDATE ON TABLE employees FROM myuser;
GRANT role_name TO user_name; -- 将用户加入角色组
REVOKE role_name FROM user_name;
# 备份单个数据库
pg_dump -U username -d dbname -F c -f backup_file.dump # 自定义格式 (推荐,支持并行恢复)
pg_dump -U username -d dbname -F p -f backup_file.sql # 纯 SQL 格式
# 备份所有数据库 (包括全局对象)
pg_dumpall -U username -f alldbs.sql
# 恢复逻辑备份 (自定义格式)
pg_restore -U username -d newdbname -C backup_file.dump # -C 表示先创建数据库
# 恢复 SQL 备份
psql -U username -d dbname -f backup_file.sql
EXPLAIN 分析查询计划: 这是调优的基础。
EXPLAIN SELECT * FROM employees WHERE last_name = 'Smith'; -- 显示计划
EXPLAIN ANALYZE SELECT ...; -- 实际执行并显示计划和实际耗时
ANALYZE table_name; 或 VACUUM ANALYZE table_name;。自动 autovacuum 进程通常会处理。shared_buffers, work_mem, effective_cache_size, random_page_cost, maintenance_work_mem。pg_stat_statements 扩展: 识别高频、高消耗的 SQL 语句。pg_top, vmstat, iostat, top 等。VACUUM: 清理死元组(由 MVCC 产生),回收空间,更新可见性信息。
VACUUM table_name; (不阻塞读写)VACUUM FULL table_name; (重写表,阻塞,需更多空间,慎用)autovacuum_vacuum_scale_factor, autovacuum_vacuum_threshold)。坚控 pg_stat_all_tables 的 n_dead_tup。REINDEX: 重建索引以消除碎片。定期或在性能下降时进行。log_destination, logging_collector, log_filename, log_rotation_size, log_rotation_age。分析日志 (pg_log) 以排查问题。pg_stat_* 视图 (pg_stat_database, pg_stat_user_tables, pg_stat_user_indexes), pg_statio_* 视图。host database user address auth-method [auth-options]trust (不安全), md5, scram-sha-256 (建议), peer (本地), cert (SSL 证书)。ALTER ROLE ... PASSWORD ... 设置强密码。考虑密码有效期(需额外设置)。postgresql.conf: ssl = on, 设置 ssl_cert_file, ssl_key_file。pg_hba.conf: 采用 hostssl 条目强制 SSL 连接。CREATE POLICY employee_policy ON employees
FOR SELECT TO sales_staff
USING (department_id = (SELECT department_id FROM user_departments WHERE username = current_user));
ALTER TABLE employees ENABLE ROW LEVEL SECURITY;
PostgreSQL 兼容多种复制方案以实现高可用性和读写分离。
pg_rewind (修复分歧的备库)。concat(), substring(), trim(), upper(), lower(), length(), position()。now(), current_date, current_time, extract(field FROM timestamp), date_trunc('unit', timestamp), age(timestamp)。abs(), round(), ceil(), floor(), sqrt(), power(), random()。count(), sum(), avg(), min(), max(), array_agg(), string_agg()。jsonb_array_elements(), jsonb_extract_path_text(), jsonb_set(), ->, ->>。结合项目来看,这份指南提供了 PostgreSQL 的全面概览和核心实践。请务必查阅官方文档以拿到最准确和最新的信息,同时根据您的具体需求和应用场景进行深入学习和设置调整。
到此这篇关于PostgreSQL数据库全攻略:从入门到精通的文章就介绍到这了,更多相关PostgreSQL从入门到精通内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多兼容脚本之家!