当前位置: 首页 > article >正文

【数据库】PostgreSQL实战:从基础到高级特性

【数据库】PostgreSQL实战从基础到高级特性引言PostgreSQL是一个功能强大的开源关系型数据库以其可靠性、扩展性和丰富的特性而闻名。本文将详细介绍PostgreSQL的核心特性、SQL操作和高级功能。一、基础概念1.1 数据库对象-- 创建数据库 CREATE DATABASE mydb; -- 创建表 CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, age INTEGER CHECK (age 0), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 创建索引 CREATE INDEX idx_users_email ON users(email); CREATE INDEX idx_users_created_at ON users(created_at DESC);1.2 数据类型类型说明示例INTEGER整数42VARCHAR(n)可变字符串HelloTEXT长文本长文章内容BOOLEAN布尔值TRUETIMESTAMP时间戳2024-01-01 12:00:00ARRAY数组ARRAY[1, 2, 3]JSONBJSON二进制{key: value}二、SQL操作2.1 查询数据-- 基础查询 SELECT id, name, email FROM users; -- 条件查询 SELECT * FROM users WHERE age 18 AND created_at 2024-01-01; -- 排序和分页 SELECT * FROM users ORDER BY created_at DESC LIMIT 10 OFFSET 20; -- 聚合查询 SELECT COUNT(*), AVG(age), MAX(age) FROM users; -- 分组查询 SELECT age, COUNT(*) FROM users GROUP BY age HAVING COUNT(*) 1;2.2 插入和更新-- 插入数据 INSERT INTO users (name, email, age) VALUES (Alice, aliceexample.com, 30); -- 批量插入 INSERT INTO users (name, email, age) VALUES (Bob, bobexample.com, 25), (Charlie, charlieexample.com, 35); -- 更新数据 UPDATE users SET age 31 WHERE name Alice; -- 删除数据 DELETE FROM users WHERE id 1;2.3 连接查询-- 创建订单表 CREATE TABLE orders ( id SERIAL PRIMARY KEY, user_id INTEGER REFERENCES users(id), amount NUMERIC(10, 2), status VARCHAR(20) ); -- INNER JOIN SELECT u.name, o.amount FROM users u INNER JOIN orders o ON u.id o.user_id; -- LEFT JOIN SELECT u.name, COUNT(o.id) as order_count FROM users u LEFT JOIN orders o ON u.id o.user_id GROUP BY u.id, u.name;三、高级特性3.1 JSONB操作-- 创建带JSONB字段的表 CREATE TABLE documents ( id SERIAL PRIMARY KEY, content JSONB ); -- 插入JSON数据 INSERT INTO documents (content) VALUES ( {title: PostgreSQL Guide, tags: [database, sql], author: {name: Alice}} ); -- 查询JSON字段 SELECT content-title as title FROM documents; -- JSONB索引 CREATE INDEX idx_documents_content ON documents USING GIN (content); -- JSONB查询 SELECT * FROM documents WHERE content {tags: [database]};3.2 数组类型-- 创建带数组字段的表 CREATE TABLE products ( id SERIAL PRIMARY KEY, name VARCHAR(100), tags TEXT[] ); -- 插入数据 INSERT INTO products (name, tags) VALUES ( Laptop, ARRAY[electronics, computer] ); -- 查询包含特定标签的产品 SELECT * FROM products WHERE electronics ANY(tags); -- 添加标签 UPDATE products SET tags array_append(tags, sale) WHERE id 1;3.3 窗口函数-- 排名函数 SELECT name, amount, RANK() OVER (ORDER BY amount DESC) as rank, DENSE_RANK() OVER (ORDER BY amount DESC) as dense_rank, ROW_NUMBER() OVER (ORDER BY amount DESC) as row_num FROM orders; -- 移动平均 SELECT date, value, AVG(value) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) as moving_avg FROM metrics; -- 分区窗口 SELECT user_id, amount, SUM(amount) OVER (PARTITION BY user_id) as total_amount FROM orders;四、性能优化4.1 索引优化-- 查看执行计划 EXPLAIN ANALYZE SELECT * FROM users WHERE email aliceexample.com; -- 创建复合索引 CREATE INDEX idx_users_name_email ON users(name, email); -- 部分索引 CREATE INDEX idx_users_active ON users(id) WHERE status active; -- 表达式索引 CREATE INDEX idx_users_lower_email ON users(LOWER(email));4.2 查询优化-- 避免SELECT * SELECT id, name FROM users WHERE age 18; -- 使用JOIN替代子查询 SELECT u.name FROM users u JOIN orders o ON u.id o.user_id WHERE o.amount 100; -- 限制结果集大小 SELECT * FROM large_table LIMIT 100;4.3 数据库配置# postgresql.conf shared_buffers 2GB # 共享缓冲区 work_mem 64MB # 排序和哈希内存 maintenance_work_mem 512MB # 维护操作内存 effective_cache_size 8GB # 有效缓存大小五、事务和并发5.1 事务控制-- 开始事务 BEGIN; -- 执行操作 UPDATE accounts SET balance balance - 100 WHERE id 1; UPDATE accounts SET balance balance 100 WHERE id 2; -- 提交事务 COMMIT; -- 回滚事务 ROLLBACK;5.2 锁机制-- 行级锁 BEGIN; SELECT * FROM orders WHERE id 1 FOR UPDATE; UPDATE orders SET status processing WHERE id 1; COMMIT; -- 共享锁 SELECT * FROM products WHERE id 1 FOR SHARE;5.3 隔离级别-- 设置隔离级别 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; -- 事务隔离级别 -- READ UNCOMMITTED - 最低级别 -- READ COMMITTED - 默认级别 -- REPEATABLE READ - 可重复读 -- SERIALIZABLE - 最高级别六、备份和恢复6.1 使用pg_dump# 备份整个数据库 pg_dump mydb mydb_backup.sql # 备份特定表 pg_dump -t users -t orders mydb tables_backup.sql # 压缩备份 pg_dump mydb | gzip mydb_backup.sql.gz # 恢复数据库 psql mydb mydb_backup.sql6.2 增量备份# 启用WAL日志 # postgresql.conf wal_level replica archive_mode on archive_command cp %p /backup/%f # 基础备份 pg_basebackup -D /backup/base -X stream # 恢复 pg_restore -d mydb /backup/base七、扩展功能7.1 安装扩展-- 安装PostGIS扩展 CREATE EXTENSION postgis; -- 安装pg_trgm扩展用于模糊搜索 CREATE EXTENSION pg_trgm; -- 安装uuid-ossp扩展 CREATE EXTENSION uuid-ossp;7.2 全文搜索-- 创建全文索引 ALTER TABLE documents ADD COLUMN content_tsv TSVECTOR; UPDATE documents SET content_tsv to_tsvector(english, content-body); CREATE INDEX idx_documents_content_tsv ON documents USING GIN(content_tsv); -- 全文搜索 SELECT * FROM documents WHERE content_tsv to_tsquery(english, database postgresql);7.3 触发器-- 创建触发器函数 CREATE FUNCTION update_modified_at() RETURNS TRIGGER AS $$ BEGIN NEW.modified_at CURRENT_TIMESTAMP; RETURN NEW; END; $$ LANGUAGE plpgsql; -- 创建触发器 CREATE TRIGGER trigger_users_modified BEFORE UPDATE ON users FOR EACH ROW EXECUTE FUNCTION update_modified_at();八、实战案例用户管理系统8.1 数据库设计-- 用户表 CREATE TABLE users ( id SERIAL PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, password_hash VARCHAR(255) NOT NULL, full_name VARCHAR(100), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 用户角色表 CREATE TABLE roles ( id SERIAL PRIMARY KEY, name VARCHAR(50) UNIQUE NOT NULL, description TEXT ); -- 用户角色关联表 CREATE TABLE user_roles ( user_id INTEGER REFERENCES users(id), role_id INTEGER REFERENCES roles(id), PRIMARY KEY (user_id, role_id) ); -- 创建索引 CREATE INDEX idx_users_email ON users(email); CREATE INDEX idx_user_roles_user_id ON user_roles(user_id);8.2 查询示例-- 获取用户及其角色 SELECT u.username, r.name as role FROM users u LEFT JOIN user_roles ur ON u.id ur.user_id LEFT JOIN roles r ON ur.role_id r.id; -- 统计各角色用户数 SELECT r.name, COUNT(ur.user_id) as user_count FROM roles r LEFT JOIN user_roles ur ON r.id ur.role_id GROUP BY r.id, r.name;九、常见问题与解决方案9.1 性能问题问题解决方案查询慢添加合适的索引锁竞争使用合适的隔离级别内存不足调整shared_buffers等参数9.2 数据一致性问题解决方案并发更新使用事务和锁数据重复使用UNIQUE约束外键引用使用FOREIGN KEY约束9.3 备份恢复问题解决方案备份过大使用压缩恢复时间长使用增量备份数据损坏定期检查数据库十、结语PostgreSQL是一个功能丰富的数据库系统掌握其核心特性对于构建可靠的应用至关重要。本文介绍了PostgreSQL的基础操作、高级特性和性能优化希望能帮助你更好地使用PostgreSQL。#PostgreSQL #数据库 #SQL #后端开发

相关文章:

【数据库】PostgreSQL实战:从基础到高级特性

【数据库】PostgreSQL实战:从基础到高级特性 引言 PostgreSQL是一个功能强大的开源关系型数据库,以其可靠性、扩展性和丰富的特性而闻名。本文将详细介绍PostgreSQL的核心特性、SQL操作和高级功能。 一、基础概念 1.1 数据库对象 -- 创建数据库 CREATE D…...

CANN/Ascend C数学函数floorf

floorf 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com/can…...

HCK代码实现原理:揭秘AI辅助学术分析的核心算法

HCK代码实现原理:揭秘AI辅助学术分析的核心算法 【免费下载链接】sala-do-futuro-script O HCK um script de anlise acadmica assistida por IA, projetado para auxiliar estudantes na resoluo de questes de tarefas e provas da plataforma sala do futuro. …...

MySQL新手必看:Navicat导入SQL文件报错1046?三步搞定数据库选择问题

MySQL图形化工具避坑指南:彻底解决1046报错与数据库选择问题 刚接触MySQL的开发者,十有八九会在第一次导入SQL文件时遇到那个令人困惑的弹窗——"Error Code: 1046. No database selected"。这个看似简单的提示背后,其实隐藏着MySQ…...

别再乱接线了!手把手教你用SC-09电缆搞定三菱FX2N PLC通讯(附GX Developer配置)

三菱FX2N PLC通讯实战:SC-09电缆的正确打开方式 第一次接触三菱FX2N PLC时,很多人都会被通讯问题难住。那些看似简单的接线背后藏着不少门道——用错线序可能导致通讯失败,甚至损坏设备。本文将带你避开常见陷阱,从硬件连接到软件…...

微生物网络分析终极指南:NetCoMi如何帮你3步构建复杂关联网络

微生物网络分析终极指南:NetCoMi如何帮你3步构建复杂关联网络 【免费下载链接】NetCoMi Network construction, analysis, and comparison for microbial compositional data 项目地址: https://gitcode.com/gh_mirrors/ne/NetCoMi 想揭开微生物群落中隐藏的…...

收藏备用!【2025 版】CMD 命令超详细大全,零基础全覆盖

在Windows操作系统中,命令提示符(CMD)是一个强大的工具,允许用户通过输入命令来执行各种操作。无论是系统管理、网络配置,还是文件管理,CMD都能提供高效的解决方案。 一、基本命令 cd:更改目录…...

保姆级教程:用VASP和VESTA搞定CO吸附在Pt(111)表面的差分电荷密度图

从零开始:CO-Pt(111)体系差分电荷密度计算全流程解析 在催化反应机理研究中,差分电荷密度分析犹如一把精密的手术刀,能够清晰揭示分子与催化剂表面之间的电子"对话"。对于刚踏入计算催化领域的研究者而言,掌握这项技能不…...

如何在macOS上免费实现光标个性化:5步完成终极美化指南

如何在macOS上免费实现光标个性化:5步完成终极美化指南 【免费下载链接】Mousecape Cursor Manager for OSX 项目地址: https://gitcode.com/gh_mirrors/mo/Mousecape 想让你的macOS光标告别单调,展现独特个性吗?Mousecape作为一款专业…...

PS4模拟器完整指南:shadPS4免费畅玩主机游戏教程

PS4模拟器完整指南:shadPS4免费畅玩主机游戏教程 【免费下载链接】shadPS4 PS4 emulator for Windows,Linux,MacOS 项目地址: https://gitcode.com/gh_mirrors/shad/shadPS4 还在寻找在电脑上体验PS4独占游戏的方法吗?shadPS4是一款免费开源的PS4…...

YimMenu:GTA5终极安全防护与游戏体验优化完整指南

YimMenu:GTA5终极安全防护与游戏体验优化完整指南 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu …...

基于SSM的在线预约导游系统(10068)

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运行一键启动项目&…...

计算机毕业设计Python+AI大模型空气质量预测分析(可定制城市) 空气质量可视化 空气质量爬虫 机器学习 深度学习 大 数据毕业设计

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…...

如何用icloudpd轻松备份你的iCloud照片库:终极免费解决方案

如何用icloudpd轻松备份你的iCloud照片库:终极免费解决方案 【免费下载链接】icloud_photos_downloader A command-line tool to download photos from iCloud 项目地址: https://gitcode.com/GitHub_Trending/ic/icloud_photos_downloader 你是否曾担心珍贵…...

LDDC歌词工具:5分钟掌握专业级歌词下载与格式转换完整指南

LDDC歌词工具:5分钟掌握专业级歌词下载与格式转换完整指南 【免费下载链接】LDDC 简单易用的精准歌词(逐字歌词/卡拉OK歌词)下载匹配工具|A simple and user-friendly tool for downloading and matching precise lyrics (word-by-word lyrics/Karaoke lyrics) 项…...

终极指南:在Linux系统上安装与优化Realtek RTL8125 2.5GbE网卡驱动

终极指南:在Linux系统上安装与优化Realtek RTL8125 2.5GbE网卡驱动 【免费下载链接】realtek-r8125-dkms A DKMS package for easy use of Realtek r8125 driver, which supports 2.5 GbE. 项目地址: https://gitcode.com/gh_mirrors/re/realtek-r8125-dkms …...

AMD GPU本地AI模型部署终极指南:ollama-for-amd让你的Radeon显卡焕发新生

AMD GPU本地AI模型部署终极指南:ollama-for-amd让你的Radeon显卡焕发新生 【免费下载链接】ollama-for-amd Get up and running with Llama 3, Mistral, Gemma, and other large language models.by adding more amd gpu support. 项目地址: https://gitcode.com/…...

YimMenu技术深度探索:现代GTA V菜单框架的安全架构与扩展机制

YimMenu技术深度探索:现代GTA V菜单框架的安全架构与扩展机制 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/…...

GGCNN实战指南:基于深度学习的实时机器人抓取生成网络深度解析

GGCNN实战指南:基于深度学习的实时机器人抓取生成网络深度解析 【免费下载链接】ggcnn Generative Grasping CNN from "Closing the Loop for Robotic Grasping: A Real-time, Generative Grasp Synthesis Approach" (RSS 2018) 项目地址: https://gitc…...

为什么你的Windows Phone需要解锁引导加载程序?深度解析WPinternals的3大核心价值

为什么你的Windows Phone需要解锁引导加载程序?深度解析WPinternals的3大核心价值 【免费下载链接】WPinternals Tool to unlock the bootloader and enable Root Access on Windows Phones 项目地址: https://gitcode.com/gh_mirrors/wp/WPinternals 你是否…...

1951-2025年中国1km月平均气温逐年变化率数据集

摘要本数据集为中国1000米分辨率月平均气温数据集(1951-2025)衍生生成的“1951-2025年中国1千米月平均气温逐年变化率数据集”产品,输出格式为TIF,覆盖中国范围,时间表达为1951-2025年。产品围绕“年际变化率”算法组织…...

搜索已死?不,它刚刚重生为Agent的“天眼”

前言2026年,AI Agent的能力正以月为单位狂飙突进。写代码、跑审计、做研报……曾经需要人类全程陪跑的任务,如今八成以上已被Agent自主接管。然而,一个看似微不足道的环节,却成了整个智能链条中最脆弱的一环——搜索。你让Agent查…...

字节面试官:你知道Claude Code的多Agent实现机制吗?

上周四晚上,我的微信弹出一条消息。一个准备跳槽字节AI Agent岗的朋友发来语音,语气像刚被泼了一盆冷水:“他们没让我手撕Transformer,也没问RLHF。上来就是一句——你知道Claude Code的多Agent实现机制吗?能不能讲一下…...

SOCD Cleaner:游戏按键智能优化工具,告别操作冲突的终极方案

SOCD Cleaner:游戏按键智能优化工具,告别操作冲突的终极方案 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 在竞技游戏和动作游戏中,精准的操作响应是胜利的关键。然而&…...

使用Python快速上手Taotoken实现你的第一个大模型对话

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Python快速上手Taotoken实现你的第一个大模型对话 对于刚接触大模型API的Python开发者而言,最直接的入门方式就是编…...

告别HAL库延时:在STM32F103上基于CubeMX和LL库,打造更高效的SysTick延时方案

STM32F103高效延时方案:从HAL库到LL库的SysTick实战优化 在嵌入式开发中,精确的延时控制往往是项目成败的关键因素之一。许多STM32开发者最初接触的是HAL库提供的HAL_Delay()函数,它简单易用,但随着项目复杂度提升,特别…...

保姆级教程:STM32CubeMX配置ADC扫描模式,并封装一个灵活的Get_Adc()函数

STM32CubeMX实战:构建可动态配置的ADC多通道扫描系统 在嵌入式开发中,ADC(模数转换器)的灵活配置一直是硬件工程师面临的常见挑战。许多开发者在使用STM32CubeMX配置多通道ADC时,往往止步于基础扫描模式的应用&#xf…...

STM32F407 HAL库驱动42步进电机:从CubeMX配置到代码调试的完整避坑指南

STM32F407 HAL库驱动42步进电机:从CubeMX配置到代码调试的完整避坑指南 在嵌入式开发领域,步进电机控制一直是工业自动化、3D打印和机器人控制等应用中的核心技术。对于刚接触STM32系列微控制器的开发者来说,使用HAL库驱动42步进电机可能会遇…...

2026年238个好发CCF-A的强化学习idea全面汇总!

最近强化学习领域迎来重磅进展!强化学习之父R.S.Sutton 提出了一种全新的范式:Intentional Updates机制!其不再盲目预设步长,而是先设定一个预期的输出改变目标,实现了内存消耗降低10-100倍的同时,性能依然…...

SegFormer凭什么不用位置编码?深入拆解Mix-FFN与重叠Patch Merging的设计哲学

SegFormer革命性设计:为何抛弃位置编码仍能称霸语义分割? 在视觉Transformer的浪潮中,SegFormer以其独特的设计哲学脱颖而出——它大胆摒弃了传统Transformer中视为标配的位置编码(Positional Encoding),却…...