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

DeepSeek 在 PostgreSQL 中,**主键**和**唯一约束**是两种最重要的数据完整性约束

在 PostgreSQL 中主键和唯一约束是两种最重要的数据完整性约束。它们都能保证数据的唯一性但用途和行为有所不同。下面详细讲解如何在 PostgreSQL 表中添加这些约束。一、约束的概念约束类型关键字作用是否创建索引允许 NULL主键PRIMARY KEY唯一标识一行记录是❌ 不允许唯一约束UNIQUE保证列值唯一是✅ 允许一个 NULL二、添加主键约束1. 创建表时定义主键单列主键CREATETABLEusers(user_idSERIALPRIMARYKEY,usernameVARCHAR(50)NOTNULL,emailVARCHAR(100));组合主键多列CREATETABLEorder_items(order_idINT,product_idINT,quantityINT,PRIMARYKEY(order_id,product_id));命名主键约束CREATETABLEusers(user_idSERIAL,usernameVARCHAR(50)NOTNULL,CONSTRAINTpk_users_idPRIMARYKEY(user_id));2. 为已存在的表添加主键基本语法ALTERTABLE表名ADDPRIMARYKEY(列名);示例-- 为已存在的 users 表添加主键ALTERTABLEusersADDPRIMARYKEY(user_id);-- 组合主键ALTERTABLEorder_itemsADDPRIMARYKEY(order_id,product_id);自定义约束名ALTERTABLEusersADDCONSTRAINTpk_usersPRIMARYKEY(user_id);3. 使用现有索引创建主键-- 先创建唯一索引CREATEUNIQUEINDEXidx_users_idONusers(user_id);-- 再将索引转为主键ALTERTABLEusersADDPRIMARYKEYUSINGINDEXidx_users_id;三、添加唯一约束1. 创建表时定义唯一约束单列唯一CREATETABLEusers(user_idSERIALPRIMARYKEY,usernameVARCHAR(50)UNIQUE,-- 方式1简写emailVARCHAR(100)CONSTRAINTusers_email_uniqueUNIQUE-- 方式2命名);多列唯一CREATETABLEusers(user_idSERIALPRIMARYKEY,first_nameVARCHAR(50),last_nameVARCHAR(50),UNIQUE(first_name,last_name)-- 组合唯一);2. 为已存在的表添加唯一约束方式一使用 ALTER TABLE推荐会创建约束对象-- 单列唯一ALTERTABLEusersADDUNIQUE(email);-- 命名约束ALTERTABLEusersADDCONSTRAINTusers_email_uniqueUNIQUE(email);-- 多列唯一ALTERTABLEusersADDCONSTRAINTusers_name_uniqueUNIQUE(first_name,last_name);方式二直接创建唯一索引不创建约束对象-- 创建唯一索引CREATEUNIQUEINDEXidx_users_emailONusers(email);-- 多列唯一索引CREATEUNIQUEINDEXidx_users_nameONusers(first_name,last_name);四、主键与唯一索引的完整示例实际业务场景用户表设计-- 创建用户表CREATETABLEusers(user_idSERIAL,usernameVARCHAR(50)NOTNULL,emailVARCHAR(100)NOTNULL,phoneVARCHAR(20),id_cardVARCHAR(18),statusVARCHAR(20)DEFAULTactive,created_atTIMESTAMPDEFAULTNOW());-- 添加主键ALTERTABLEusersADDCONSTRAINTpk_usersPRIMARYKEY(user_id);-- 添加唯一约束ALTERTABLEusersADDCONSTRAINTusers_username_uniqueUNIQUE(username);ALTERTABLEusersADDCONSTRAINTusers_email_uniqueUNIQUE(email);ALTERTABLEusersADDCONSTRAINTusers_phone_uniqueUNIQUE(phone);ALTERTABLEusersADDCONSTRAINTusers_id_card_uniqueUNIQUE(id_card);-- 查看表结构\d users订单系统示例-- 订单表CREATETABLEorders(order_idSERIAL,order_noVARCHAR(50)NOTNULL,user_idINTNOTNULL,statusVARCHAR(20),created_atTIMESTAMPDEFAULTNOW());-- 订单明细表CREATETABLEorder_items(order_idINT,product_idINT,quantityINTNOTNULL,priceDECIMAL(10,2)NOTNULL);-- 添加主键ALTERTABLEordersADDCONSTRAINTpk_ordersPRIMARYKEY(order_id);ALTERTABLEordersADDCONSTRAINTorders_order_no_uniqueUNIQUE(order_no);ALTERTABLEorder_itemsADDCONSTRAINTpk_order_itemsPRIMARYKEY(order_id,product_id);-- 添加外键约束ALTERTABLEorder_itemsADDCONSTRAINTfk_order_items_ordersFOREIGNKEY(order_id)REFERENCESorders(order_id);五、处理添加约束时的常见问题问题1添加主键时表中有重复数据-- 1. 找出重复数据SELECTuser_id,COUNT(*)FROMusersGROUPBYuser_idHAVINGCOUNT(*)1;-- 2. 删除重复数据保留一条DELETEFROMusers aUSINGusers bWHEREa.user_idb.user_idANDa.ctidb.ctid;-- ctid 是行物理位置保留最新的一条-- 3. 添加主键ALTERTABLEusersADDPRIMARYKEY(user_id);问题2添加唯一约束时有重复值-- 1. 找出重复的 emailSELECTemail,COUNT(*)FROMusersGROUPBYemailHAVINGCOUNT(*)1;-- 2. 处理重复数据例如只保留最新的记录DELETEFROMusersWHERE(email,created_at)NOTIN(SELECTemail,MAX(created_at)FROMusersGROUPBYemail);-- 3. 添加唯一约束ALTERTABLEusersADDCONSTRAINTusers_email_uniqueUNIQUE(email);问题3大表添加约束的性能考虑-- 对大表可以先创建索引再用索引创建约束-- 这样可以更好地控制锁表时间-- 先并发创建唯一索引不阻塞读写CREATEUNIQUEINDEXCONCURRENTLY idx_users_email_tmpONusers(email);-- 再用索引创建约束ALTERTABLEusersADDCONSTRAINTusers_email_uniqueUNIQUEUSINGINDEXidx_users_email_tmp;六、约束的管理和维护查看约束信息-- 查看表的所有约束SELECTconnameASconstraint_name,contypeASconstraint_type,pg_get_constraintdef(oid)ASdefinitionFROMpg_constraintWHEREconrelidusers::regclass;-- contype 说明-- p 主键约束-- u 唯一约束-- f 外键约束-- c 检查约束查看索引信息-- 查看表的所有索引SELECTindexname,indexdefFROMpg_indexesWHEREtablenameusers;删除约束-- 删除主键约束ALTERTABLEusersDROPCONSTRAINTpk_users;-- 删除唯一约束ALTERTABLEusersDROPCONSTRAINTusers_email_unique;-- 删除唯一索引如果是直接创建的索引DROPINDEXidx_users_email;临时禁用约束PostgreSQL 不支持直接禁用约束但可以通过修改约束属性实现类似效果-- 将约束设置为可延迟并在事务中临时推迟检查ALTERTABLEusersALTERCONSTRAINTusers_email_unique DEFERRABLE INITIALLY DEFERRED;-- 在事务中插入数据提交时才检查唯一性BEGIN;SETCONSTRAINTS users_email_unique DEFERRED;INSERTINTOusers(email)VALUES(testexample.com);INSERTINTOusers(email)VALUES(testexample.com);-- 临时重复没问题COMMIT;-- 提交时如果还有重复才会报错七、最佳实践总结设计原则每个表都应该有主键- 通常使用自增列SERIAL 或 IDENTITY业务唯一键用 UNIQUE 约束- 便于管理和文档化组合主键要谨慎- 除非确实需要否则建议用单列代理键 唯一约束索引命名规范- 使用有意义的名称便于维护主键pk_表名唯一约束表名_列名_unique唯一索引idx_表名_列名_unique命名规范示例CREATETABLEproducts(product_idSERIAL,product_codeVARCHAR(50)NOTNULL,product_nameVARCHAR(200)NOTNULL,CONSTRAINTpk_productsPRIMARYKEY(product_id),CONSTRAINTproducts_code_uniqueUNIQUE(product_code));CREATEINDEXidx_products_nameONproducts(product_name);性能考虑大表添加约束- 使用CONCURRENTLY或先用索引再建约束维护窗口- 约束添加会锁表选择业务低峰期操作定期维护- 使用REINDEX重建索引提升性能如果你有具体的表结构或业务需求欢迎告诉我我可以帮你设计合适的约束方案。

相关文章:

DeepSeek 在 PostgreSQL 中,**主键**和**唯一约束**是两种最重要的数据完整性约束

在 PostgreSQL 中,主键和唯一约束是两种最重要的数据完整性约束。它们都能保证数据的唯一性,但用途和行为有所不同。下面详细讲解如何在 PostgreSQL 表中添加这些约束。 一、约束的概念 约束类型关键字作用是否创建索引允许 NULL主键PRIMARY KEY唯一标识…...

C++编程进阶:探索抽象类与纯虚函数的奥秘

C编程进阶:探索抽象类与纯虚函数的奥秘 在C编程的广阔天地中,面向对象编程(OOP)作为其核心特性之一,为开发者提供了强大的工具来构建复杂而灵活的软件系统。其中,抽象类和纯虚函数是OOP中两个至关重要的概…...

零宽度字符实战:纯文本数字水印的隐蔽嵌入与提取方法

1. 零宽度字符:看不见的信息搬运工 你有没有遇到过这样的情况:明明两段文字看起来一模一样,但复制到不同地方时却显示不同的结果?这很可能就是零宽度字符在暗中作祟。这些特殊的Unicode字符就像文字世界的"隐形墨水"&am…...

【硬核解析】千问请喝奶茶口令中奇怪但能看懂的字是怎么打出来的

不知道大家有没有发现,这几天千问通义的分享文案悄悄改了,仔细看每个字都多了“一点”,并且这个点并无法单独选中。 注意每个字的上、下方有额外的点 原理探究 把这个字转为Unicode看看,发现这是两个字符,这个点的uni…...

SCI论文投稿全流程解析:从注册到成功提交

1. 投稿前的准备工作 第一次投稿SCI论文就像第一次开车上路,既兴奋又紧张。记得我投第一篇论文时,光是准备阶段就花了整整两周时间,反复检查各种细节。现在回头看,其实只要做好这几个关键准备,就能事半功倍。 选刊是门…...

Gemini 3技术拆解:原生多模态与1M上下文背后的架构创新

在主流大模型中,Gemini 3凭借原生多模态能力和超长上下文窗口独树一帜。目前国内用户可通过聚合平台RskAi(www.rsk.cn)免费体验Gemini 3的全部功能,无需特殊网络环境,实测响应速度稳定在1秒左右。本文将从技术角度深入…...

Java内部类全解析:从入门到精通,拿捏所有细节!❶

🍏家人们谁懂啊!Java里的内部类简直是「隐藏神技」,用得好直接让代码优雅到起飞,面试还能直接拿捏面试官!今天咱们就把内部类扒得明明白白,从概念到实战,小白也能秒懂,老鸟也能查漏补…...

VS2019+QT5.12.10+PCL1.11.1环境配置避坑指南:从安装到第一个点云窗口显示

VS2019QT5.12.10PCL1.11.1环境配置全流程与点云可视化实战 在三维视觉和机器人感知领域,点云处理技术正成为不可或缺的核心能力。本文将手把手带你完成从零搭建开发环境到实现第一个点云可视化Demo的全过程,特别针对Windows平台下VS2019与QT5.12.10、PCL…...

科哥GPEN镜像:修复模糊人像照片,效果实测案例分享

科哥GPEN镜像:修复模糊人像照片,效果实测案例分享 1. 引言:从模糊到高清的魔法 你是否遇到过这样的情况:翻看老照片时,发现那些珍贵的记忆因为画面模糊而变得难以辨认?或者手机拍摄的人像照片因为光线不足…...

(三)Python基础入门-流程控制结构

(三)Python基础入门-流程控制结构 概览 条件语句(if/elif/else嵌套)循环结构(while/for循环)循环控制(break/continue/pass)实战:猜数字游戏/乘法表生成 流程控制是编程的…...

OptiStruct非线性分析避坑指南:从MATS1设置到高温蠕变模拟

OptiStruct非线性分析实战:从材料模型到高温蠕变仿真 在工程仿真领域,非线性分析正成为解决复杂问题的关键工具。当结构面临塑性变形、大位移或温度变化时,线性假设往往失效,此时OptiStruct提供的非线性分析能力显得尤为重要。本文…...

LaTeX小白必看:用\ctexset定制你的章节标题样式(article类实战)

LaTeX排版艺术:用\ctexset打造专业级章节标题样式 第一次接触LaTeX时,我被它那默认的章节标题样式深深困扰——呆板的字体、单调的编号、不合理的间距,让我的学术论文看起来毫无个性。直到发现了\ctexset这个神奇的命令,我的文档才…...

【实战】FastAPI 服务器部署中接口访问失败的排查与解决

1. 为什么你的FastAPI接口在服务器上无法访问? 最近帮朋友排查一个FastAPI部署问题,他的接口在本地测试一切正常,但部署到云服务器后就死活访问不了。这其实是很多新手都会踩的坑,我自己刚用FastAPI时也遇到过类似问题。今天我们就…...

StructBERT中文相似度模型部署案例:RTX 4090上10分钟完成语义匹配环境搭建

StructBERT中文相似度模型部署案例:RTX 4090上10分钟完成语义匹配环境搭建 你是不是也遇到过这样的问题?面对海量的中文文本,想要快速找出意思相近的句子,却不知道从何下手。手动比对?效率太低。用简单的关键词匹配&a…...

从零构建Rocky Linux 9.4全能工作站:虚拟机部署与全栈软件生态搭建指南

1. 虚拟机环境搭建与系统安装 Rocky Linux作为RHEL的完美替代品,越来越受到开发者和运维人员的青睐。我最近在虚拟机上完整部署了9.4版本,实测下来稳定性完全不输CentOS。下面分享我的详细操作记录,帮你避开我踩过的那些坑。 1.1 虚拟机软件选…...

C#异步编程实战:用Task.WhenAll和CancellationTokenSource打造一个高并发、可取消的批量文件下载器

C#异步编程实战:构建高并发可取消的批量文件下载器 在当今互联网应用中,处理大量文件下载是常见需求。无论是电商平台的商品图片抓取、企业文档管理系统,还是数据备份工具,都需要高效可靠的批量下载能力。传统同步下载方式不仅速度…...

构建企业级服务中台的几个关键设计思想

作为一名技术人员,我理解的“服务”,不仅仅是一个代码功能,更是一套复杂的业务流程和数据处理系统。在接触了“帮我吧”这样的企业级一体化智能服务管理平台后,我发现它背后蕴含的设计思想,非常值得我们技术人借鉴。 …...

告别复杂配置!ANIMATEDIFF PRO保姆级部署教程,RTX 4090开箱即用

告别复杂配置!ANIMATEDIFF PRO保姆级部署教程,RTX 4090开箱即用 1. 为什么选择ANIMATEDIFF PRO 如果你正在寻找一款能够生成电影级视频的AI工具,ANIMATEDIFF PRO可能是目前最强大的选择之一。它基于AnimateDiff架构和Realistic Vision V5.1…...

STM32F401RE HSI+PLL 84MHz轻量时钟配置库

1. 项目概述ST_401_84MHZ是一个面向 STM32F401RE Nucleo 开发板的轻量级时钟配置库,其核心目标是将系统主频(SYSCLK)稳定、可靠地提升至84 MHz。该频率并非芯片默认出厂配置(F401RE 的默认 HSI 为 16 MHz,复位后 SYSCL…...

OpenCL维度跨越

上面讲到怎么在一维问题里面进行操作,那么下面来讲述一下二维(矩阵或者图像)。在OpenCL里面,这种跨越核心在于坐标系的变化。坐标系的升级:在一维里,我们只用到了get_global_id(0)。但是在二维中&#xff0…...

告别复杂配置:M2FP人体解析镜像一键部署,小白也能轻松上手

告别复杂配置:M2FP人体解析镜像一键部署,小白也能轻松上手 1. 为什么你需要M2FP人体解析服务 想象一下,你正在开发一个虚拟试衣应用,或者需要分析监控视频中的人物行为。传统方法需要手动标注每一帧图像中的人体部位&#xff0c…...

告别黑盒:手把手教你定制Unity WebGL的加载页面与浏览器交互(模板、JS插件、通信全解析)

深度定制Unity WebGL:从加载界面到浏览器交互的全链路实战指南 1. 为什么需要定制WebGL加载体验? 当用户首次访问基于Unity WebGL构建的网页应用时,默认的灰色进度条和纯白背景往往无法传递产品调性。数据显示,经过视觉优化的加载…...

【Django 实战】从零打造功能完备的博客系统——爱博客(iBlog)

【Django 实战】从零打造功能完备的博客系统——爱博客(iBlog) 摘要:本文详细介绍了一个基于 Django 4.2 Bootstrap 5.3 开发的全功能博客系统,包含用户管理、文章发布、双重审核、树形评论、AJAX 互动等核心功能。项目代码完整&…...

GriddyCode:用Lua脚本打造个性化代码编辑器的终极指南

GriddyCode:用Lua脚本打造个性化代码编辑器的终极指南 【免费下载链接】griddycode 项目地址: https://gitcode.com/GitHub_Trending/gr/griddycode GriddyCode是一款基于Godot引擎开发的开源代码编辑器,它通过独特的Lua脚本系统让开发者能够深度…...

【56页PPT】工业互联网工业超脑智能制造智慧工厂解决方案:总体架构设计、九大核心价值、九大数字化详细功能介绍、五大要素......

本方案以“工业超脑”为核心,构建了一个覆盖研发、生产、设备、能源、质量、安环、供应链等全流程的数字化工厂体系。通过物联网、大数据、人工智能等技术,实现数据驱动的智能决策、预测性维护、能效优化与安全保障,助力化工企业实现本质安全…...

从干系人管理到项目交付:绩效域全流程避坑指南

从干系人管理到项目交付:绩效域全流程避坑指南 在项目管理领域,干系人管理和项目交付是决定项目成败的两大核心要素。据统计,近70%的项目失败案例可追溯至干系人管理不当或交付流程失控。对于已经掌握基础项目管理方法的中级项目经理而言&…...

分布式驱动电动汽车:最优横摆力矩控制与规则扭矩分配控制的对比研究——基于LQR计算与最小附着利...

分布式驱动电动汽车 直接横摆力矩控制 最优/规则扭矩分配控制 上层lqr计算 下层最小附着利用率分配 扭矩分配 对比传统esc 效果优良 稳定性控制 操纵稳定性 matlab simulink代码源码 carsim联合仿真 深夜调车党的工位上总少不了一杯冰美式,摸着方向盘力反馈器突然想…...

48个适合人力资源工作和运营的AI提示词

本提示库包含了直接源自活动分享见解且受其启发的实用 AI 提示。每个部分都有可直接复制粘贴的示例,目的是帮助您节省时间、降低风险并简化人力资源工作流程。 这些提示适用于深度求索、通义千问等工具。请牢记:清晰度和背景信息至关重要,不同…...

第三部分:CHI事务类型与流程

第7章:读取事务全解析本章系统性地解析CHI协议中各类读取事务,从基础功能到高级优化机制,揭示其设计哲学与性能权衡。7.1 基础读取事务:ReadNoSnp、ReadOnce这两类事务是读取操作的基础,但设计目标和行为有本质区别。特…...

Nunchaku-flux-1-dev在.NET开发中的应用:API文档自动生成

Nunchaku-flux-1-dev在.NET开发中的应用:API文档自动生成 还在为写API文档头疼吗?试试让AI帮你自动生成 作为一名.NET开发者,你可能经常遇到这样的场景:项目进度紧张,代码写完了,却要花大量时间手动编写API…...