复合主键与联合主键[通俗易懂]

复合主键与联合主键[通俗易懂]一、复合主键 所谓的复合主键就是指你表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键。比如 createtabletest(namevarchar(19),idnumber,valuevarchar(10),primarykey(name,id))上面的name和id字段组合起来就是你

大家好,又见面了,我是你们的朋友全栈君。

一、复合主键


  所谓的复合主键 就是指你表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键。

比如 


create table test 
( 
   name varchar(19), 
   id number, 
   value varchar(10), 
   primary key (name,id) 
) 


上面的name和id字段组合起来就是你test表的复合主键 ,它的出现是因为你的name字段可能会出现重名,所以要加上ID字段这样就可以保证你记录的唯一性 ,一般情况下,主键的字段长度和字段数目要越少越好 。


这里就会有一个疑惑?  主键是唯一的索引,那么为何一个表可以创建多个主键呢?


其实“主键是唯一的索引”这话有点歧义的。举个例子,我们在表中创建了一个ID字段,自动增长,并设为主键,这个是没有问题的,因为“主键是唯一的索引”,ID自动增长保证了唯一性,所以可以。


此时,我们再创建一个字段name,类型为varchar,也设置为主键,你会发现,在表的多行中你是可以填写相同的name值的,这岂不是有违“主键是唯一的索引”这句话么?


所以我才说“主键是唯一的索引”是有歧义的。应该是“当表中只有一个主键时,它是唯一的索引;当表中有多个主键时,称为复合主键,复合主键联合保证唯一索引”。


为什么自增长ID已经可以作为唯一标识的主键,为啥还需要复合主键呢。因为,并不是所有的表都要有ID这个字段,比如,我们建一个学生表,没有唯一能标识学生的ID,怎么办呢,学生的名字、年龄、班级都可能重复,无法使用单个字段来唯一标识,这时,我们可以将多个字段设置为主键,形成复合主键这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样,就不算重复。


二、联合主键


           联合主键顾名思义就是多个主键联合形成一个主键组合(主键原则上是唯一的,别被唯一值所困扰。)  

           联合主键的意义:用2个字段(或者多个字段,后面具体都是用2个字段组合)来确定一条记录,说明,这2个字段都不是唯一的,2个字段可以分别重复,这么设置的好处,可以很直观的看到某个重复字段的记录条数。

一个简单的例子 


主键A跟主键B组成联合主键 


主键A跟主键B的数据可以完全相同,联合就在于主键A跟主键B形成的联合主键是唯一的。 
下例主键A数据是1,主键B数据也是1,联合主键其实是11,这个11是唯一值,绝对不充许再出现11这个唯一值。(这就是多对多关系) 


主键A数据 主键B数据 
1      1 
2      2 
3      3 


主键A与主键B的联合主键值最多也就是 


11 
12 
13 
21 
22 
23 
31 
32 
33


总结: 以我来看复合主键就是含有一个以上的字段组成,如ID+name,ID+phone等,而联合主键要同时是两个表的主题组合起来的。这是和复合主键最大的区别!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149863.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 淘宝抢购Python脚本

    淘宝抢购Python脚本想买mate40,但总是抢不到,所以想试着能不能写个脚本代码。第一步:把想要抢购的商品加进购物车,注意:脚本是对购物车内全部商品进行下单操作,所以不够买的商品最好先从购物车内删除。第二步:写好Python脚本,在抢购之前运行,并设置好抢购时间。Python脚本实现安装Python。我安装的是anaconda安装webdriver扩展。它是Selenium模块的一部分。Selenium是一个用于Web应用程序测试的工具,用于测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。Selen

  • XXE攻击与防御

    XXE攻击与防御XXEXXE是一种很常见的漏洞类型危害也挺大的,如果一个web服务器通过用户上传处理XML文件或POST请求时,那么可能就会存在漏洞。前段时间比较出名的微信支付的xxe漏洞漏洞简历XXE就是XML外部实体注入,当服务器允许引用外部实体时,同过构建恶意内容来攻击网站产生原因解析xml文件时允许加载外部实体,并且实体的URL支持file://和PHP://等协议,没有过滤用户提交的参数危害读取任意文件执行系统命令探测内网端口攻击内网网站DOS攻击…漏洞检测利用burp检测那些接

  • 六款大数据采集平台的架构分析

    六款大数据采集平台的架构分析本文转自:《六款大数据采集平台的架构分析》文中介绍了目前业界存在的六款数据采集平台,数据采集平台可以作为数据平台的日志采集系统,个人尝试过Flume+ES+Kibana这样的开源组合,为什么这么选,因为Flume非常灵活且无缝的支持Hadoop生态系统的大部分组件,ES和Kibana也是比较成熟的开源大数据实时搜索展示的组合。随着大数据越

  • Python3_打开和运行方式

    Python3_打开和运行方式蹬蹬蹬……第一次写博客,如有错误欢迎指正。Python很火,前几天也是因为需要装了一下,但是并没有用它,今天打开准备刚准备试下,才发现自己对这个软件一无所知,百度了一些资料发现并不能用才知道pyth

  • linux oracle修改密码_linux 更改用户密码

    linux oracle修改密码_linux 更改用户密码Linux环境中修改Oracle用户密码第一步:[root@localhost~]#[color=green]su-oracle[/color]第二步:[oracle@localhost~]$[color=green]sqlplus/nolog;[/color]第三步:SQL>…

  • Unity 点乘和叉乘的原理和使用

    Unity 点乘和叉乘的原理和使用Unity当中经常会用到向量的运算来计算目标的方位,朝向,角度等相关数据,下面咱们来通过实例学习下Unity当中最常用的点乘和叉乘的使用。点乘 (又称”点积”,”数量积”,”内积”)(DotProduct,用*)定义:a·b=|a|·|b|cos【注:粗体小写字母表示向量,表示向量a,b的夹角,取值范围为[0,180]】几何意义:是一条边向另一条边的投影乘以另一条边的长度.

    2022年10月23日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号