事务是一个或多个SQL语句的组合,这些语句作为一个单元执行,要么全部成功要么全部失败。事务的使用方式如下:
BEGIN;
-- SQL 语句
COMMIT; -- 提交事务
-- 或者
ROLLBACK; -- 回滚事务
PostgreSQL支持四种事务隔离级别:
设置事务隔离级别:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
PostgreSQL支持多种锁,以控制并发访问:
SELECT FOR UPDATE
)。LOCK TABLE
)。示例:
SELECT * FROM mytable WHERE id = 1 FOR UPDATE;
联合查询使用UNION
操作符合并多个查询结果集:
SELECT name FROM employees
UNION
SELECT name FROM customers;
窗口函数在结果集中执行计算,并保留原始行:
SELECT name, salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC)
FROM employees;
子查询是嵌套在另一个查询中的查询:
SELECT name FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE location = 'New York');
CTE是一种在查询中定义临时结果集的方式:
WITH DepartmentSalary AS (
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
)
SELECT * FROM DepartmentSalary WHERE avg_salary > 50000;
PostgreSQL允许创建自定义数据类型:
CREATE TYPE mood AS ENUM ('happy', 'sad', 'neutral');
PostgreSQL支持数组数据类型:
CREATE TABLE contacts (
id SERIAL PRIMARY KEY,
phone_numbers TEXT[]
);
INSERT INTO contacts (phone_numbers) VALUES ('{123-4567, 890-1234}');
PostgreSQL支持JSON数据类型,并提供多种JSON函数和操作符:
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
order_info JSON
);
INSERT INTO orders (order_info) VALUES ('{"customer": "John", "items": ["book", "pen"]}');
查询JSON数据:
SELECT order_info->>'customer' AS customer FROM orders;
部分索引只索引满足特定条件的行:
CREATE INDEX idx_active_users ON users (email) WHERE active = TRUE;
表达式索引使用表达式创建索引:
CREATE INDEX idx_lower_email ON users (LOWER(email));
GIN和GiST索引用于复杂数据类型(如全文搜索和地理数据):
CREATE INDEX idx_gin ON documents USING GIN (to_tsvector('english', content));
使用EXPLAIN
分析查询执行计划:
EXPLAIN SELECT * FROM mytable WHERE id = 1;
调整PostgreSQL配置文件(postgresql.conf
)以优化性能:
使用pg_basebackup
进行物理备份:
pg_basebackup -D /path/to/backup -Fp -Xs -P
使用pg_dump
进行逻辑备份:
pg_dump mydatabase > mydatabase_backup.sql
PostGIS扩展为PostgreSQL添加地理空间数据支持:
CREATE EXTENSION postgis;
pg_cron扩展允许在PostgreSQL中调度作业:
CREATE EXTENSION pg_cron;
SELECT cron.schedule('nightly_backup', '0 3 * * *', 'pg_dump mydatabase > /path/to/backup.sql');
设置流复制以实现主从复制:
-- 在主服务器上
wal_level = replica
max_wal_senders = 3
hot_standby = on
-- 在从服务器上
standby_mode = 'on'
primary_conninfo = 'host=master_host port=5432 user=replicator password=yourpassword'
restore_command = 'cp /path/to/wal_archive/%f %p'
Patroni是一个自动化高可用解决方案:
# 安装Patroni
pip install patroni
# 配置Patroni
patroni /path/to/patroni.yml
以上是PostgreSQL的进阶教程,涵盖了事务和并发控制、高级查询、数据类型、高级索引、性能调优、备份与恢复、扩展与插件以及集群与高可用等内容。希望这些内容能帮助您更深入地理解和使用PostgreSQL。